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

104

Я устанавливаю заголовок своего контроллера просмотра, как это видно, загрузилось:

self.title = @"my title";

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

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

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

Как я могу этого добиться?

Атма
источник

Ответы:

223

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

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

Swift:

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 08
175

Так что для тех, кто до сих пор этого не понимает (как я)

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

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

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

Саймон Эпскэмп
источник
20

Swift

Установить заголовок верхней панели

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

Установить заголовок элемента вкладки

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

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

self.title = "both titles"
Suragch
источник
Что есть topItem?
imike 05
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и напрямую связать их со своим ВК.

    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 для себя и контроллеров навигации, встроенных в каждую из ваших вкладок соответственно.

.час:

@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 изменяет заголовок навигации И tabBar. (если ВК уже подключен к обоим).

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

волк
источник
0

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")
}
cs4alhaider
источник