como alterar o título do uiviewcontroller independente do título do item da barra de ferramentas

104

Estou definindo o título do meu controlador de visualização como este em visualização carregou:

self.title = @"my title";

antes disso, defino o título nos storyboards para o controlador de visualização e o controlador de navegação em que está embutido. Defino-o como: "Título";

Quando clico na guia que contém o controlador de visualização, o título do item da barra de guias uiviewcontrollermuda para: meu título

Gostaria que o controlador de visualização mudasse, mas o item da barra de guias permanecesse com o título: Título

Como posso fazer isso?

Atma
fonte

Respostas:

223

Parece que você deseja que o título na barra de navegação mude, mas não o da barra de guias. Isso deve fazer isso.

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

Rápido:

self.navigationItem.title = "My Title"
Craig Siemens
fonte
1
Certifique-se, se você ainda estiver usando self.title para definir o título do uitabbar, para definir self.navigation setTitle após, caso contrário, não funcionará
simon_smiley
2
no xcode 9 e no ios 11 no swift 4, ele mostra o erro de uso inequívoco do título
Sushobhit
1
Trabalhando para mim no Xcode 10.2 usando Swift 4.2, muito obrigado!
jangelsb
174

Então, para aqueles que ainda não entenderam (como eu)

self.navigationItem.title = @"my title";define o título da barra de navegação .

self.tabBarItem.title = @"my title";define o título da barra da guia .

self.title = @"my title";define ambos .

Simon Epskamp
fonte
20

Rápido

Definir título da barra superior

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

Definir título do item da guia

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

Defina os dois títulos

self.title = "both titles"
Suragch
fonte
O que é topItem?
imike
2
Essa era a única maneira de definir o título da barra superior em minha configuração, sem saber por que "self.navigationItem.title" não funcionou para mim.
JohnnyC de
7

Para Swift use isso,

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
Mohammad Zaid Pathan
fonte
em xcode 9 e ios 11 em swift 4 (self.navigation.title) mostrando erro que uso inequívoco do título
Sushobhit
6

Nota: Se você tiver um controlador de barra de guias com controladores de navegação na raiz de cada controlador de visualização, definir o item da barra de guias nos controladores de visualização não afetará o título se você estiver configurando o navigationItem.title. Em vez disso, você precisará definir o tabBarItemno controlador de navegação para que ele seja obtido no controlador da barra de guias.

Nenhuma das respostas postadas por outras pessoas funcionou para mim porque todos os controladores de visualização da minha barra de guias têm controladores de navegação em sua raiz - este é um padrão de hierarquia comum para UITabBarController. Você deve definir o controlador de navegação tabBarItempara fazer com que o título seja mostrado de forma diferente do navigationItemtítulo de

Você pode criar seus tabBarIteme associá-los ao seu VC diretamente.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Então você terá algo assim:

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

Mas isso deve ser alterado para o seguinte para obter o já associado tabBarItemdo controlador de visualização e configurá-lo no controlador de navegação automaticamente.

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

Agora você poderá ter um título diferente (definido em seu VC), separado do título definido para seu tabBarItem.

Pavan
fonte
0

Bem tarde para isso. Você poderia ter seu TabBarController servindo como UITabBarControllerDelegate e UINavigationControllerDelegate para si mesmo e os controladores de navegação embutidos em cada uma de suas guias, respectivamente.

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

Com base em alguns testes rápidos, parece que essas duas ações delegadas devem abranger todos os casos soltos e atualizarão o título se você estiver alternando as guias ou navegando em seu controlador de navegação. Para completar, você poderia atualizar seu título em didShowViewController também, mas com base no que vi, não acho que seja necessário.

Ruiz
fonte
0

Provavelmente um pouco tarde (mas).

Definir o título de um VC altera o título da Navegação E da barra de guias. (se o VC já estiver conectado a ambos).

Se você quiser ter títulos separados, você precisa defini-los manualmente, você normalmente define o título para o VC e, em seguida, especificamente o título do tabBarItem, já que é uma propriedade do

wolffan
fonte
0

Swift 4.2

Aqui está, criei uma extensão para 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
 }

}

E então do seu controlador:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
cs4alhaider
fonte