bagaimana mengubah judul uiviewcontroller independen dari judul item tabbar

104

Saya menetapkan judul pengontrol tampilan saya seperti ini dalam tampilan yang dimuat:

self.title = @"my title";

sebelum ini saya menetapkan judul di papan cerita untuk pengontrol tampilan dan pengontrol navigasi yang tertanam di dalamnya. Saya mengaturnya ke: "Judul";

Ketika saya mengklik tab yang menahan pengontrol tampilan, judul item tab bar dan uiviewcontrollerubah menjadi: judul saya

Saya ingin pengontrol tampilan berubah tetapi item tab bar tetap dengan judul: Judul

Bagaimana saya bisa melakukannya?

Atma
sumber

Jawaban:

223

Sepertinya Anda ingin judul di bilah navigasi berubah tetapi bukan yang ada di bilah tab. Ini harus dilakukan.

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

Cepat:

self.navigationItem.title = "My Title"
Craig Siemens
sumber
1
Pastikan, jika Anda masih menggunakan self.title untuk menyetel judul uitabbar Anda, untuk menyetel self.navigation setTitle setelah jika tidak maka tidak akan berfungsi
simon_smiley
2
di xcode 9 dan ios 11 di swift 4 itu menunjukkan kesalahan bahwa penggunaan judul yang tidak ambigu
Sushobhit
1
Bekerja untuk saya di Xcode 10.2 menggunakan Swift 4.2, terima kasih banyak!
jangelsb
174

Jadi bagi yang masih belum mengerti (seperti saya)

self.navigationItem.title = @"my title";menetapkan judul bilah navigasi .

self.tabBarItem.title = @"my title";mengatur judul tab bar .

self.title = @"my title";mengatur keduanya .

Simon Epskamp
sumber
20

Cepat

Tetapkan judul bilah atas

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

Setel judul item tab

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

Tetapkan kedua judul

self.title = "both titles"
Suragch
sumber
Apa topItem?
imike
2
Ini adalah satu-satunya cara saya dapat menyetel judul bilah atas dalam konfigurasi saya, tidak yakin mengapa "self.navigationItem.title" tidak berhasil untuk saya.
JohnnyC
7

Untuk Swift gunakan ini,

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
Mohammad Zaid Pathan
sumber
di xcode 9 dan ios 11 di swift 4 (self.navigation.title) menunjukkan kesalahan bahwa penggunaan judul yang tidak ambigu
Sushobhit
6

Catatan: Jika Anda memiliki pengontrol bilah tab dengan pengontrol navigasi di root dari setiap pengontrol tampilan, pengaturan item bilah tab pada pengontrol tampilan tidak akan memengaruhi judul jika Anda menyetel navigationItem.title. Anda harus mengatur tabBarItemke pengontrol navigasi sebagai gantinya untuk diambil dari pengontrol bilah tab.

Tidak ada jawaban yang diposting oleh orang lain yang berfungsi untuk saya karena pengontrol tampilan bilah tab saya semuanya memiliki pengontrol navigasi di root mereka - ini adalah pola hierarki umum untuk UITabBarController. Anda harus menyetel pengontrol navigasi tabBarItemuntuk mendapatkan judul yang ditampilkan secara berbeda dari navigationItemjudulnya

Anda dapat membuat tabBarItemdan mengaitkannya ke VC Anda secara langsung seperti itu.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Maka Anda akan memiliki sesuatu seperti ini:

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

Tetapi itu harus diubah ke yang berikut untuk mengambil yang sudah terkait tabBarItemdari pengontrol tampilan dan mengaturnya ke pengontrol navigasi secara otomatis.

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

Anda sekarang akan dapat memiliki judul yang berbeda (ditetapkan dari VC Anda) terpisah dari judul yang ditentukan untuk Anda tabBarItem.

Pavan
sumber
0

Cukup terlambat untuk ini. Anda bisa membuat TabBarController Anda berfungsi sebagai UITabBarControllerDelegate dan UINavigationControllerDelegate untuk dirinya sendiri dan pengontrol navigasi yang disematkan di masing-masing tab Anda.

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

Berdasarkan beberapa pengujian cepat, sepertinya kedua tindakan delegasi ini harus mencakup kasus longgar dan akan memperbarui judul apakah Anda beralih tab atau menjelajah di pengontrol navigasi Anda. Untuk kelengkapan, Anda dapat memperbarui judul Anda di didShowViewController juga, tetapi berdasarkan apa yang saya lihat, saya rasa itu tidak perlu.

Ruiz
sumber
0

Mungkin agak terlambat (tapi).

Mengatur judul VC akan mengubah judul Navigasi DAN tabBar. (jika VC sudah terpasang ke keduanya).

Jika Anda ingin memiliki judul terpisah, Anda perlu mengaturnya secara manual, biasanya Anda menetapkan judul untuk VC dan kemudian secara khusus judul tabBarItem, karena ini adalah properti dari

wolffan
sumber
0

Swift 4.2.0

Ini dia, saya membuat ekstensi untuk 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
 }

}

Dan kemudian dari pengontrol Anda:

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