uiviewcontroller başlığı tabbar öğesi başlığından bağımsız olarak nasıl değiştirilir


104

Görünüm denetleyicilerimin başlığını şu şekilde ayarlıyorum: görünümde yüklendi:

self.title = @"my title";

bundan önce, gömülü olduğu görünüm denetleyicisi ve gezinme denetleyicisi için hikaye panolarına başlığı ayarladım. Bunu şu şekilde ayarladım: "Başlık";

Görünüm denetleyicisini tutan sekmeye tıkladığımda sekme çubuğu öğesinin başlığını ve şu şekilde uiviewcontrollerdeğiştirdiğim: benim başlığım

Görünüm denetleyicisinin değişmesini istiyorum, ancak sekme çubuğu öğesinin şu başlıkla kalmasını istiyorum: Başlık

Bunu nasıl başarabilirim?

Yanıtlar:


223

Görünüşe göre gezinme çubuğundaki başlığın değişmesini istiyor, ancak sekme çubuğundaki başlığın değişmesini istemiyorsunuz. Bunu yapmalı.

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

Swift:

self.navigationItem.title = "My Title"

1
Emin olun, uitabbar başlığınızı ayarlamak için self.title kullanıyorsanız, self.navigation setTitle'ı ayarlamak için, aksi takdirde çalışmayacaktır
simon_smiley

2
swift 4'teki xcode 9 ve ios 11'de başlık kullanımının açık bir şekilde kullanılması hatası gösteriyor
Sushobhit

1
Swift 4.2 kullanarak Xcode 10.2'de benim için çalışıyorum, çok teşekkürler!
jangelsb

175

Bu yüzden hala anlamayanlar için (benim gibi)

self.navigationItem.title = @"my title";gezinme çubuğu başlığını ayarlar .

self.tabBarItem.title = @"my title";sekme çubuğu başlığını ayarlar .

self.title = @"my title";bunların ikisini de ayarlar .


20

Swift

Üst çubuk başlığını ayarlayın

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

Sekme öğesi başlığını ayarla

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

Her iki başlığı da ayarlayın

self.title = "both titles"

Nedir topItem?
imike

2
Yapılandırmamda üst çubuk başlığımı ayarlayabilmemin tek yolu buydu, "self.navigationItem.title" benim için neden çalışmadığından emin değilim.
JohnnyC

7

For Swift bunu kullanın,

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

swift 4'te (self.navigation.title) xcode 9 ve ios 11'de başlığın açık bir şekilde kullanılması hatası gösteriliyor
Sushobhit

6

Not: Her bir görünüm denetleyicisinin kökünde gezinme denetleyicileri olan bir sekme çubuğu denetleyiciniz varsa, görünüm denetleyicilerinde sekme çubuğu öğesinin ayarlanması navigationItem.title,. tabBarItemSekme çubuğu denetleyicisinden alınması için bunun yerine gezinme denetleyicisine ayarlamanız gerekir .

Başkaları tarafından gönderilen yanıtların hiçbiri benim için işe yaramadı çünkü sekme çubuğumun görünüm denetleyicilerinin hepsinin köklerinde gezinme denetleyicileri var - bu, için ortak bir hiyerarşi modelidir UITabBarController. tabBarItemBaşlığın görünenden farklı bir şekilde görünmesini sağlamak için gezinme denetleyicisini ayarlamanız gerekir .navigationItem bireyin başlığı

Kendinizi oluşturabilir tabBarItemve bunları doğrudan VC'nizle ilişkilendirebilirsiniz.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

O zaman şuna benzer bir şeye sahip olacaksınız:

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

Ancak halihazırda ilişkilendirilmiş olanı tabBarItemgörünüm denetleyicisinden almak ve otomatik olarak gezinme denetleyicisine ayarlamak için bunun aşağıdaki şekilde değiştirilmesi gerekir .

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

Artık tabBarItem.


0

Buna oldukça geç. TabBarController'ınızın kendisi için UITabBarControllerDelegate ve UINavigationControllerDelegate ve sekmelerinizin her birine gömülü gezinme denetleyicileri olarak hizmet vermesini sağlayabilirsiniz.

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

Bazı hızlı testlere dayanarak, bu iki delege eyleminin tüm gevşek durumları kapsaması gerektiği ve sekmeleri değiştirirken veya gezinme denetleyicinizde gezinirken başlığı güncelleyeceği görülüyor. Tamlık için, başlığınızı didShowViewController'da da güncelleyebilirsiniz , ancak gördüklerime dayanarak bunun gerekli olduğunu düşünmüyorum.


0

Muhtemelen biraz geç (ama).

Bir VC'nin başlığının ayarlanması, Navigasyon VE sekme Çubuğunun başlığını değiştirir. (VC zaten her ikisine de eklenmişse).

Ayrı başlıklara sahip olmak istiyorsanız, bunları manuel olarak ayarlamanız gerekir; normalde VC için başlığı ve ardından özellikle tabBarItem'in başlığını ayarlarsınız, çünkü bu,


0

Swift 4.2

İşte UIViewController için bir uzantı oluşturdum:

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
 }

}

Ve sonra kontrol cihazınızdan:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.