วิธีการเปลี่ยนหัวเรื่อง uiviewcontroller โดยไม่ขึ้นกับชื่อรายการแถบแถบ


105

ฉันกำลังตั้งชื่อตัวควบคุมมุมมองของฉันเช่นนี้ในมุมมองได้โหลด:

self.title = @"my title";

ก่อนหน้านี้ฉันตั้งชื่อเรื่องในกระดานเรื่องราวสำหรับตัวควบคุมมุมมองและตัวควบคุมการนำทางที่ฝังอยู่ฉันตั้งค่าเป็น: "ชื่อเรื่อง";

เมื่อฉันคลิกที่แท็บที่มีตัวควบคุมมุมมองชื่อของรายการแถบแท็บและuiviewcontrollerเปลี่ยนเป็น: ชื่อของฉัน

ฉันต้องการให้ตัวควบคุมมุมมองเปลี่ยน แต่รายการแถบแท็บจะยังคงอยู่กับชื่อ: ชื่อเรื่อง

ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?

คำตอบ:


224

ดูเหมือนว่าคุณต้องการให้ชื่อในแถบนำทางเปลี่ยน แต่ไม่ใช่ชื่อในแถบแท็บ สิ่งนี้ควรทำเช่นนั้น

[self.navigationItem setTitle:@"my title"];

รวดเร็ว:

self.navigationItem.title = "My Title"

1
ตรวจสอบให้แน่ใจว่าหากคุณยังคงใช้ self.title เพื่อตั้งชื่อ uitabbar ของคุณเพื่อตั้งค่า self.navigation setTitle หลังจากนั้นจะไม่ทำงาน
simon_smiley

2
ใน xcode 9 และ ios 11 ใน swift 4 แสดงข้อผิดพลาดที่ใช้ชื่ออย่างไม่ชัดเจน
Sushobhit

1
ทำงานให้ฉันใน Xcode 10.2 โดยใช้ Swift 4.2 ขอบคุณมาก!
jangelsb

176

ดังนั้นสำหรับผู้ที่ยังไม่เข้าใจ (เช่นฉัน)

self.navigationItem.title = @"my title";ตั้งชื่อแถบนำทาง

self.tabBarItem.title = @"my title";ตั้งชื่อแถบแท็บ

self.title = @"my title";ชุดทั้งสองคนนี้


21

รวดเร็ว

ตั้งชื่อแถบด้านบน

self.navigationController?.navigationBar.topItem?.title = "top title"

ตั้งชื่อรายการแท็บ

self.tabBarController?.tabBar.items?[0].title = "tab title"

ตั้งชื่อทั้งสอง

self.title = "both titles"

คืออะไรtopItem?
เหมือน

2
นี่เป็นวิธีเดียวที่ฉันสามารถตั้งชื่อแถบด้านบนในการกำหนดค่าของฉันไม่แน่ใจว่าทำไม "self.navigationItem.title" ไม่ได้ผลสำหรับฉัน
JohnnyC

7

สำหรับSwift ให้ใช้สิ่งนี้

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"

ใน xcode 9 และ ios 11 ใน swift 4 (self.navigation.title) แสดงข้อผิดพลาดที่ใช้ชื่ออย่างไม่คลุมเครือ
Sushobhit

6

หมายเหตุ: หากคุณมีตัวควบคุมแถบแท็บที่มีตัวควบคุมการนำทางที่รูทของตัวควบคุมมุมมองแต่ละตัวการตั้งค่ารายการแถบแท็บบนตัวควบคุมมุมมองจะไม่มีผลกับชื่อเรื่องหากคุณกำลังตั้งค่าไฟล์navigationItem.title. คุณจะต้องตั้งค่าtabBarItemลงในตัวควบคุมการนำทางแทนเพื่อให้รับจากตัวควบคุมแถบแท็บ

ไม่มีคำตอบที่โพสต์โดยคนอื่นทำงานสำหรับฉันเพราะแถบแท็บของฉันควบคุมมุมมองทั้งหมดมีตัวควบคุมการนำทางที่รากของพวกเขา - UITabBarControllerนี่คือรูปแบบลำดับชั้นที่พบบ่อยสำหรับ คุณต้องตั้งค่าตัวควบคุมการนำทางtabBarItemแทนเพื่อให้หัวเรื่องแสดงแตกต่างจากnavigationItemชื่อของ

คุณสามารถสร้างtabBarItemและเชื่อมโยงกับ VC ของคุณได้โดยตรงเช่นนั้น

    let tabBarVCOne = BooksListViewController()
    tabBarVCOne.tabBarItem = UITabBarItem(title: "Books", image: nil, tag: 0)

    tabBarViewControllers.append(tabBarVCOne)
    ...

จากนั้นคุณจะมีสิ่งนี้:

    //Wrap each view controller in a navigation controller. 
    self.viewControllers = tabBarViewControllers.map(UINavigationController.init)

แต่ควรเปลี่ยนเป็นสิ่งต่อไปนี้เพื่อคว้าสิ่งที่เชื่อมโยงอยู่แล้วtabBarItemจากตัวควบคุมมุมมองและตั้งค่าลงในตัวควบคุมการนำทางโดยอัตโนมัติ

    self.viewControllers = tabBarViewControllers.map({
        let navigationController = UINavigationController(rootViewController: $0)
        navigationController.tabBarItem = $0.tabBarItem
        return navigationController
    })

ตอนนี้คุณจะสามารถมีชื่อเรื่องอื่น (ตั้งค่าจาก VC ของคุณ) แยกจากชื่อที่กำหนดไว้สำหรับtabBarItemไฟล์.


0

ค่อนข้างสายไปแล้ว คุณสามารถให้ TabBarController ของคุณทำหน้าที่เป็น UITabBarControllerDelegate และ UINavigationControllerDelegate สำหรับตัวมันเองและตัวควบคุมการนำทางที่ฝังอยู่ในแต่ละแท็บของคุณตามลำดับ

.h:

@interface YourTabBarController : UITabBarController <UITabBarControllerDelegate, UINavigationControllerDelegate>

@end

.m:

- (void) viewDidLoad {
    // UITabBarControllerDelegate
    self.delegate = self;

    // UINavigationControllerDelegates
    yourNavigationController.delegate = self;
    ...
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
    yourNavigationController.tabBarItem.title = @"Tab Bar Title";
    ...
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    yourNavigationController.tabBarItem.title = @"Tab Bar Title";
    ...
}

จากการทดสอบอย่างรวดเร็วบางอย่างดูเหมือนว่าการดำเนินการของผู้ร่วมประชุมทั้งสองนี้ควรครอบคลุมกรณีที่หลวม ๆ และจะอัปเดตชื่อไม่ว่าคุณจะเปลี่ยนแท็บหรือเรียกดูในตัวควบคุมการนำทางของคุณ เพื่อความสมบูรณ์คุณสามารถอัปเดตชื่อของคุณในdidShowViewController ได้เช่นกัน แต่จากสิ่งที่ฉันเห็นฉันไม่คิดว่ามันจำเป็น


0

อาจจะช้าไปหน่อย (แต่)

การตั้งชื่อของ VC จะเปลี่ยนชื่อของการนำทางและแถบแท็บ (หากแนบ VC กับทั้งสองอย่างแล้ว)

หากคุณต้องการมีชื่อเรื่องแยกกันคุณต้องตั้งค่าเหล่านั้นด้วยตนเองโดยปกติคุณจะตั้งชื่อสำหรับ VC จากนั้นโดยเฉพาะชื่อเรื่องของ tabBarItem เนื่องจากเป็นคุณสมบัติของ


0

สวิฟต์ 4.2

จัดไปฉันสร้างส่วนขยายสำหรับ UIViewController:

import UIKit

extension UIViewController {

/// Setting the navigation title and tab bar title
///
/// - Parameters:
///   - navigationTitle: Navigation title
///   - tabBarTitle: TabBar title
func setTitles(navigationTitle: String, tabBarTitle: String) {
    // Order is important here!
    title = tabBarTitle
    navigationItem.title = navigationTitle
 }

}

จากนั้นจากคอนโทรลเลอร์ของคุณ:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.