cách thay đổi tiêu đề uiviewcontroller độc lập với tiêu đề mục trên thanh tab


104

Tôi đang đặt tiêu đề bộ điều khiển chế độ xem của mình như thế này trong chế độ xem đã tải:

self.title = @"my title";

trước đó, tôi đặt tiêu đề trong bảng câu chuyện cho bộ điều khiển chế độ xem và bộ điều khiển điều hướng mà nó được nhúng vào. Tôi đặt nó thành: "Tiêu đề";

Khi tôi nhấp vào tab chứa bộ điều khiển chế độ xem, tiêu đề của mục thanh tab và uiviewcontrollerthay đổi thành: tiêu đề của tôi

Tôi muốn bộ điều khiển chế độ xem thay đổi nhưng mục thanh tab vẫn giữ nguyên tiêu đề: Tiêu đề

Làm thế nào tôi có thể thực hiện điều này?

Câu trả lời:


221

Có vẻ như bạn muốn tiêu đề trong thanh điều hướng thay đổi nhưng không phải tiêu đề trong thanh tab. Điều này nên làm điều đó.

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

Nhanh:

self.navigationItem.title = "My Title"

1
Hãy chắc chắn rằng, nếu bạn vẫn đang sử dụng self.title để thiết lập tiêu đề uitabbar của bạn, để thiết lập self.navigation setTitle sau nếu không nó sẽ không làm việc
simon_smiley

2
trong xcode 9 và ios 11 trong nhanh chóng 4 nó hiển thị lỗi rằng việc sử dụng rõ ràng quyền sở hữu
Sushobhit

1
Làm việc cho tôi trong Xcode 10.2 bằng Swift 4.2, cảm ơn rất nhiều!
jangelsb

174

Vì vậy, đối với những người vẫn chưa hiểu nó (như tôi)

self.navigationItem.title = @"my title";đặt tiêu đề thanh điều hướng .

self.tabBarItem.title = @"my title";đặt tiêu đề thanh tab .

self.title = @"my title";thiết lập cả hai .


20

Nhanh

Đặt tiêu đề thanh trên cùng

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

Đặt tiêu đề mục tab

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

Đặt cả hai tiêu đề

self.title = "both titles"

topItemgì?
imike

2
Đây là cách duy nhất tôi có thể đặt tiêu đề thanh trên cùng trong cấu hình của mình, không biết tại sao "self.navigationItem.title" không hoạt động với tôi.
JohnnyC

7

Đối với Swift, hãy sử dụng cái này,

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

trong xcode 9 và ios 11 trong nhanh chóng 4 (self.navigation.title) cho thấy rằng việc sử dụng lỗi rõ ràng quyền sở hữu
Sushobhit

6

Lưu ý: Nếu bạn có bộ điều khiển thanh tab với bộ điều khiển điều hướng ở gốc của mỗi bộ điều khiển chế độ xem, việc đặt mục thanh tab trên bộ điều khiển chế độ xem sẽ không ảnh hưởng đến tiêu đề nếu bạn đang đặt navigationItem.title. tabBarItemThay vào đó, bạn sẽ cần thiết lập bộ điều khiển điều hướng để nó được chọn từ bộ điều khiển thanh tab.

Không có câu trả lời nào được đăng bởi những người khác phù hợp với tôi bởi vì các bộ điều khiển chế độ xem trên thanh tab của tôi đều có bộ điều khiển điều hướng ở gốc - đây là mẫu phân cấp phổ biến UITabBarController. tabBarItemThay vào đó, bạn phải đặt bộ điều khiển điều hướng để tiêu đề hiển thị khác với navigationItemtiêu đề của

Bạn có thể tạo tabBarItemvà liên kết chúng với VC của bạn trực tiếp như vậy.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Sau đó, bạn sẽ có một cái gì đó như thế này:

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

Nhưng điều đó nên được thay đổi thành như sau để lấy cái đã được liên kết tabBarItemtừ bộ điều khiển chế độ xem và đặt nó vào bộ điều khiển điều hướng tự động.

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

Bây giờ bạn sẽ có thể có một tiêu đề khác (đặt từ VC của bạn) tách biệt với tiêu đề được xác định cho của bạn tabBarItem.


0

Khá muộn cho điều này. Bạn có thể có TabBarController của mình phục vụ như UITabBarControllerDelegate và UINavigationControllerDelegate cho chính nó và các bộ điều khiển điều hướng được nhúng trong mỗi tab của bạn tương ứng.

.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";
    ...
}

Dựa trên một số thử nghiệm nhanh, có vẻ như hai hành động ủy quyền này sẽ bao gồm mọi trường hợp lỏng lẻo và sẽ cập nhật tiêu đề cho dù bạn đang chuyển đổi tab hoặc duyệt trong bộ điều khiển điều hướng của mình. Để hoàn thiện, bạn cũng có thể cập nhật tiêu đề của mình trong didShowViewController , nhưng dựa trên những gì tôi đã thấy, tôi không nghĩ nó cần thiết.


0

Có lẽ là hơi muộn (nhưng).

Đặt tiêu đề của VC thay đổi tiêu đề của Điều hướng VÀ Thanh tab. (nếu VC đã được gắn vào cả hai).

Nếu bạn muốn có các tiêu đề riêng biệt, bạn cần phải đặt các tiêu đề đó theo cách thủ công, bạn thường đặt tiêu đề cho VC và sau đó cụ thể là tiêu đề của tabBarItem, vì nó là thuộc tính của


0

Swift 4.2

Đây, tôi đã tạo một tiện ích mở rộng cho 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
 }

}

Và sau đó từ bộ điều khiển của bạn:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.