як змінити назву uiviewcontroller незалежно від заголовка елемента вкладки


104

Я встановлюю назву моїх контролерів перегляду таким чином, як це виглядало:

self.title = @"my title";

перед цим я встановлював заголовок на дошках сюжетів для контролера перегляду та навігаційного контролера, в який він вбудований. Я встановлював його: "Назва";

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

Я хотів би, щоб контролер перегляду змінився, але елемент рядка вкладки повинен залишатися з заголовком: Назва

Як я можу це досягти?

Відповіді:


221

Здається, ви хочете змінити заголовок на навігаційній панелі, але не той, який знаходиться на панелі вкладок. Це має зробити це.

[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

174

Тож для тих, хто досі цього не отримує (як я)

self.navigationItem.title = @"my title";встановлює назву панелі навігації

self.tabBarItem.title = @"my title";встановлює заголовок рядка вкладки .

self.title = @"my title";встановлює і те і інше .


20

Швидкий

Встановити заголовок верхньої смуги

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

Встановити назву елемента вкладки

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

Встановити обидва заголовки

self.title = "both titles"

Що таке topItem?
imike

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

Тепер ви зможете мати інший заголовок (встановлений на вашому ПК) окремим від заголовка, визначеного для вашого 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, а потім конкретно заголовок 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")
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.