cómo cambiar el título de uiviewcontroller independientemente del título del elemento de la barra de pestañas

104

Estoy configurando el título de mis controladores de vista como este en la vista que se cargó:

self.title = @"my title";

antes de esto, establezco el título en los storyboards para el controlador de vista y el controlador de navegación en el que está integrado. Lo configuro en: "Título";

Cuando hago clic en la pestaña que contiene el controlador de vista, el título del elemento de la barra de pestañas y uiviewcontrollercambio a: mi título

Me gustaría que el controlador de vista cambiara, pero el elemento de la barra de pestañas permaneciera con el título: Título

¿Cómo puedo lograr esto?

Atma
fuente

Respuestas:

221

Parece que desea que cambie el título de la barra de navegación, pero no el de la barra de pestañas. Esto debería hacer eso.

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

Rápido:

self.navigationItem.title = "My Title"
Craig Siemens
fuente
1
Asegúrese de que, si todavía está utilizando self.title para establecer su título UITabBar, a setTitle conjunto self.navigation después de lo contrario no funcionará
simon_smiley
2
en xcode 9 e ios 11 en swift 4, muestra un error de uso inequívoco del título
Sushobhit
1
Trabajando para mí en Xcode 10.2 usando Swift 4.2, ¡muchas gracias!
jangelsb
174

Entonces para aquellos que todavía no lo entienden (como yo)

self.navigationItem.title = @"my title";establece el título de la barra de navegación .

self.tabBarItem.title = @"my title";establece el título de la barra de pestañas .

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

Simon Epskamp
fuente
20

Rápido

Establecer título de la barra superior

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

Establecer título de elemento de pestaña

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

Establecer ambos títulos

self.title = "both titles"
Suragch
fuente
¿Qué es topItem?
imike
2
Esta era la única forma en que podía establecer el título de la barra superior en mi configuración, no estoy seguro de por qué "self.navigationItem.title" no funcionó para mí.
JohnnyC
7

Para Swift usa esto,

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
Mohammad Zaid Pathan
fuente
en xcode 9 e ios 11 en swift 4 (self.navigation.title) que muestra el error de uso inequívoco del título
Sushobhit
6

Nota: Si tiene un controlador de barra de pestañas con controladores de navegación en la raíz de cada controlador de vista, configurar el elemento de la barra de pestañas en los controladores de vista no afectará el título si está configurando el navigationItem.title. Deberá configurar el tabBarItemen el controlador de navegación en su lugar para que se recoja desde el controlador de la barra de pestañas.

Ninguna de las respuestas publicadas por otros me funcionó porque todos los controladores de vista de mi barra de pestañas tienen controladores de navegación en su raíz; este es un patrón de jerarquía común para UITabBarController. En su lugar, debe configurar el controlador de navegación tabBarItempara que el título se muestre de manera diferente al navigationItemtítulo de

Puede crear sus tabBarItemy asociarlos a su VC directamente como tal.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Entonces tendrás algo como esto:

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

Pero eso debería cambiarse a lo siguiente para tomar el ya asociado tabBarItemdel controlador de vista y configurarlo en el controlador de navegación automáticamente.

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

Ahora podrá tener un título diferente (establecido de su VC) separado del título definido para su tabBarItem.

Pavana
fuente
0

Bastante tarde para esto. Puede hacer que su TabBarController sirva como UITabBarControllerDelegate y UINavigationControllerDelegate para sí mismo y los controladores de navegación incrustados en cada una de sus pestañas, respectivamente.

.h:

@interface YourTabBarController : UITabBarController <UITabBarControllerDelegate, UINavigationControllerDelegate>

@end

.metro:

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

Según algunas pruebas rápidas, parece que estas dos acciones delegadas deberían cubrir cualquier caso suelto y actualizarán el título, ya sea que esté cambiando de pestaña o navegando en su controlador de navegación. Para completar, también puede actualizar su título en didShowViewController , pero según lo que he visto, no creo que sea necesario.

Ruiz
fuente
0

Probablemente un poco tarde (pero).

Establecer el título de un VC cambia el título de la navegación Y la barra de pestañas. (si el VC ya está conectado a ambos).

Si desea tener títulos separados, debe configurarlos manualmente, normalmente establece el título para el VC y luego específicamente el título de tabBarItem, ya que es una propiedad del

Wolffan
fuente
0

Rápido 4.2

Aquí tienes, creé una extensión 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
 }

}

Y luego desde tu controlador:

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