Как изменить название uiviewcontroller независимо от названия элемента вкладки

Я устанавливаю свой заголовок диспетчера просмотров, как это было в режиме загрузки:

self.title = @"my title";

до этого я установил заголовок в досках рассказов для контроллера вида и контроллера навигации, в который он встроен. Я установил его: "Название";

Когда я нажимаю на вкладку, содержащую контроллер представления, заголовок элемента панели вкладок и uiviewcontroller изменяется на: my title

Я бы хотел, чтобы контроллер вида изменился, но элемент панели вкладок остался с заголовком: Title

Как я могу это сделать?

Ответ 1

Похоже, вы хотите изменить заголовок на панели навигации, но не та, которая находится на панели. Это должно сделать это.

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

Swift:

self.navigationItem.title = "My Title"

Ответ 2

Итак, для тех, кто до сих пор не понял (как я)

self.navigationItem.title = @"my title"; устанавливает заголовок навигационной панели.

self.tabBarItem.title = @"my title"; устанавливает заголовок вкладки.

self.title = @"my title"; устанавливает оба этих.

Ответ 3

Swift

Настроить заголовок заголовка

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

Задать название элемента вкладки

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

Установите оба заголовка

self.title = "both titles"

Ответ 4

Для Swift используйте это,

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

Ответ 5

Примечание. Если у вас есть контроллер панели вкладок с контроллерами навигации в корне каждого контроллера представления, установка элемента панели вкладок на контроллерах представления не повлияет на заголовок, если вы устанавливаете navigationItem.title. Вам нужно будет установить tabBarItem на контроллере навигации вместо этого, чтобы он был взят из контроллера панели вкладок.

Ни один из ответов, отправленных другими, не работал для меня, потому что все мои контроллеры представления панели вкладок имеют контроллеры навигации в своем корне - это общий шаблон иерархии для UITabBarController. tabBarItem этого необходимо установить контроллер навигации 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 уже связанный tabBarItem из контроллера представления и автоматически установить его на контроллер навигации.

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

Теперь вы сможете иметь другой заголовок (установленный из вашего VC) отдельно от заголовка, определенного для вашего tabBarItem.

Ответ 6

Я верю в метод viewDidLoad контроллера вида, который вы можете сделать:

self.title = @"my title";
self.tabBarItem.title = @"tab title";

Ответ 7

Довольно поздно. Вы можете использовать свой 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, но, основываясь на том, что я видел, я не думаю, что это необходимо.

Ответ 8

Вероятно, немного поздно (но).

Установка заголовка VC изменяет заголовок навигации AND tabBar. (если VC уже привязан к обоим).

Если вы хотите иметь отдельные заголовки, вам нужно их вручную установить, вы обычно устанавливаете заголовок для VC, а затем, в частности, название tabBarItem, так как это свойство

Ответ 9

Swift 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")
}