come cambiare il titolo di uiviewcontroller indipendentemente dal titolo dell'elemento della barra delle schede


104

Sto impostando il titolo dei controller di visualizzazione in questo modo in quanto è stato caricato:

self.title = @"my title";

prima di questo ho impostato il titolo negli storyboard per il controller di visualizzazione e il controller di navigazione in cui è incorporato. L'ho impostato su: "Title";

Quando faccio clic sulla scheda che contiene il controller della vista, il titolo dell'elemento della barra delle schede e uiviewcontrollercambio in: il mio titolo

Vorrei che il controller della vista cambiasse ma l'elemento della barra delle schede rimanga con il titolo: Titolo

Come posso farlo?

Risposte:


223

Sembra che tu voglia cambiare il titolo nella barra di navigazione ma non quello nella barra delle schede. Questo dovrebbe farlo.

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

Swift:

self.navigationItem.title = "My Title"

1
Assicurati, se stai ancora usando self.title per impostare il titolo uitabbar, per impostare self.navigation setTitle dopo altrimenti non funzionerà
simon_smiley

2
in xcode 9 e ios 11 in swift 4 mostra l'errore che l'uso inequivocabile del titolo
Sushobhit

1
Lavorando per me in Xcode 10.2 usando Swift 4.2, grazie mille!
jangelsb

174

Quindi per quelli che ancora non lo capiscono (come me)

self.navigationItem.title = @"my title";imposta il titolo della barra di navigazione .

self.tabBarItem.title = @"my title";imposta il titolo della barra delle schede .

self.title = @"my title";imposta entrambi questi .


20

veloce

Imposta il titolo della barra superiore

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

Imposta il titolo dell'elemento della scheda

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

Imposta entrambi i titoli

self.title = "both titles"

Che cos'è topItem?
come il

2
Questo era l'unico modo in cui potevo impostare il titolo della barra superiore nella mia configurazione, non sapendo perché "self.navigationItem.title" non funzionasse per me.
JohnnyC

7

Per Swift usa questo,

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

in xcode 9 e ios 11 in swift 4 (self.navigation.title) che mostra l'errore che l'uso inequivocabile del titolo
Sushobhit

6

Nota: se si dispone di un controller della barra delle schede con controller di navigazione alla radice di ogni controller della visualizzazione, l'impostazione dell'elemento della barra delle schede nei controller della visualizzazione non influirà sul titolo se si imposta l'estensione navigationItem.title. Dovrai invece impostare il tabBarItemsul controller di navigazione per poterlo prelevare dal controller della barra delle schede.

Nessuna delle risposte pubblicate da altri ha funzionato per me perché i controller di visualizzazione della mia barra delle schede hanno tutti i controller di navigazione alla radice: questo è un modello gerarchico comune per UITabBarController. Devi invece impostare il controller di navigazione tabBarItemper visualizzare il titolo in modo diverso dal navigationItemtitolo di

Puoi crearli tabBarIteme associarli al tuo VC direttamente in questo modo.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Quindi avrai qualcosa del genere:

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

Ma questo dovrebbe essere cambiato come segue per prendere il già associato tabBarItemdal controller di visualizzazione e impostarlo automaticamente sul controller di navigazione.

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

Ora potrai avere un titolo diverso (impostato dal tuo VC) separato dal titolo definito per il tuo tabBarItem.


0

Piuttosto tardi per questo. Puoi fare in modo che il tuo TabBarController funga da UITabBarControllerDelegate e UINavigationControllerDelegate per se stesso e per i controller di navigazione incorporati rispettivamente in ciascuna delle tue schede.

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

Sulla base di alcuni test rapidi, sembra che queste due azioni delegate dovrebbero coprire eventuali casi sciolti e aggiorneranno il titolo sia che tu stia cambiando scheda o navigando nel controller di navigazione. Per completezza, potresti aggiornare il tuo titolo anche in didShowViewController , ma in base a quello che ho visto, non credo sia necessario.


0

Probabilmente un po 'tardi (ma).

L'impostazione del titolo di un VC cambia il titolo della Navigazione E della tabBar. (se il VC è già collegato a entrambi).

Se vuoi avere titoli separati, devi impostarli manualmente, normalmente imposti il ​​titolo per il VC e quindi in particolare il titolo del tabBarItem, poiché è una proprietà del


0

Swift 4.2

Ecco, ho creato un'estensione per 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 poi dal tuo controller:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.