jak zmienić tytuł uiviewcontroller niezależnie od tytułu elementu paska

104

Ustawiam tytuł moich kontrolerów widoku w następujący sposób:

self.title = @"my title";

przedtem ustawiłem tytuł w scenorysie dla kontrolera widoku i kontrolera nawigacji, w którym jest osadzony. Ustawiłem go na: "Tytuł";

Kiedy kliknę kartę, która zawiera kontroler widoku, tytuł elementu paska kart i uiviewcontrollerzmieniam się na: mój tytuł

Chciałbym, aby kontroler widoku się zmienił, ale element paska kart pozostał z tytułem: Tytuł

Jak mogę to osiągnąć?

Atma
źródło

Odpowiedzi:

223

Wygląda na to, że chcesz zmienić tytuł na pasku nawigacyjnym, ale nie ten na pasku kart. To powinno wystarczyć.

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

Szybki:

self.navigationItem.title = "My Title"
Craig Siemens
źródło
1
Upewnij się, że jeśli nadal używasz self.title do ustawiania tytułu uitabbar, ustaw self.navigation setTitle po, w przeciwnym razie to nie zadziała
simon_smiley
2
w xcode 9 i ios 11 w swift 4 pokazuje błąd, że jednoznaczne użycie tytułu
Sushobhit
1
Pracuję dla mnie w Xcode 10.2 przy użyciu Swift 4.2, wielkie dzięki!
jangelsb
175

Więc dla tych, którzy nadal tego nie rozumieją (jak ja)

self.navigationItem.title = @"my title";ustawia tytuł paska nawigacji .

self.tabBarItem.title = @"my title";ustawia tytuł paska zakładek .

self.title = @"my title";ustawia oba te elementy .

Simon Epskamp
źródło
20

Szybki

Ustaw tytuł górnego paska

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

Ustaw tytuł elementu karty

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

Ustaw oba tytuły

self.title = "both titles"
Suragch
źródło
Co to jest topItem?
imike
2
To był jedyny sposób, w jaki mogłem ustawić tytuł górnego paska w mojej konfiguracji, nie jestem pewien, dlaczego „self.navigationItem.title” nie działa w moim przypadku.
JohnnyC
7

Dla szybkiego użyj tego,

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
Mohammad Zaid Pathan
źródło
w xcode 9 i ios 11 w swift 4 (self.navigation.title) pokazujący błąd, że jednoznaczne użycie tytułu
Sushobhit
6

Uwaga: Jeśli masz kontroler paska kart z kontrolerami nawigacji w katalogu głównym każdego kontrolera widoku, ustawienie elementu paska kart na kontrolerach widoku nie wpłynie na tytuł, jeśli ustawisz navigationItem.title. Zamiast tego musisz ustawić tabBarItemna kontroler nawigacyjny, aby można go było pobrać z kontrolera paska kart.

Żadna z odpowiedzi opublikowanych przez innych nie zadziałała dla mnie, ponieważ wszystkie kontrolery widoku mojego paska kart mają kontrolery nawigacji w swoim katalogu głównym - jest to typowy wzorzec hierarchii dla UITabBarController. Musisz tabBarItemzamiast tego ustawić kontroler nawigacji, aby tytuł wyświetlał się inaczej niż navigationItemtytuł

Możesz tworzyć własne tabBarItemi bezpośrednio przypisywać je do swojego VC.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Wtedy będziesz miał coś takiego:

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

Ale należy to zmienić na następujące, aby pobrać już skojarzony tabBarItemz kontrolera widoku i ustawić go automatycznie na kontrolerze nawigacyjnym.

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

Będziesz mógł teraz mieć inny tytuł (zestaw z Twojego VC) niezależnie od tytułu zdefiniowanego dla Twojego tabBarItem.

Pavan
źródło
0

Dość późno na to. Możesz mieć TabBarController służyć jako UITabBarControllerDelegate i UINavigationControllerDelegate dla siebie i kontrolerów nawigacji osadzonych odpowiednio w każdej z twoich kart.

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

Opierając się na szybkich testach, wydaje się, że te dwie akcje delegatów powinny obejmować wszelkie luźne przypadki i aktualizować tytuł niezależnie od tego, czy przełączasz karty, czy przeglądasz w kontrolerze nawigacyjnym. Aby uzyskać kompletność, możesz również zaktualizować swój tytuł w didShowViewController , ale na podstawie tego, co widziałem, nie sądzę, aby było to konieczne.

Ruiz
źródło
0

Prawdopodobnie trochę późno (ale).

Ustawienie tytułu VC zmienia tytuł nawigacji ORAZ pasek tabulacji. (jeśli VC jest już dołączony do obu).

Jeśli chcesz mieć osobne tytuły, musisz je ustawić ręcznie, zwykle ustawiasz tytuł dla VC, a konkretnie tytuł tabBarItem, ponieważ jest to właściwość

wolffan
źródło
0

Swift 4.2

Proszę bardzo, stworzyłem rozszerzenie dla 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
 }

}

A następnie z kontrolera:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
cs4alhaider
źródło