簡體   English   中英

從UINavigationController設置UITabBarItem標題?

[英]Setting UITabBarItem title from UINavigationController?

我已經設置了一個帶有兩個選項卡的UITabBarController,一個是簡單的UIViewController,另一個是使用第二個UIViewController作為其rootController的UINavigationController(稍后將用於設置UITableView)。 我的問題是關於命名選項卡(即設置每個UITabBarItem的標題)

對於第一個選項卡(簡單的UIViewController),我在控制器-init方法中添加了以下內容(見下文)。

// FROM -[MapController init]
- (id)init {
    self = [super init];
    if(self) {
        UITabBarItem *tabBarItem = [self tabBarItem];
        [tabBarItem setTitle:@"ONE"];
    }
    return self;
}

對於我添加的另一個選項卡(見下文)到第二個控制器init(rootController)。

// FROM -[TableController init]
- (id)init {
    self = [super init];
    if(self) {
        UITabBarItem *tabBarItem = [[self navigationController] tabBarItem];
        [tabBarItem setTitle:@"TWO"];
    }
    return self;
}

我在正確的位置設置第二個tabBarItem標題,因為它當前沒有顯示,當我運行應用程序時,第一個標簽顯示“ONE”,第二個標簽為空白。 另外tabBarItem(上面)在我打印值或通過調試器查看時顯示nil。

EDIT_001:從AppDelegate添加了完整代碼

當我第一次創建控制器時,我可以在AppDelegate中正確設置UITabBarItem,准備添加到UITabBarController。 但我真的很想在單獨的控制器中實現這一點 - 整潔的方法。

// UITabBarController
UITabBarController *tempRoot = [[UITabBarController alloc] init];
[self setRootController:tempRoot];
[tempRoot release];
NSMutableArray *tabBarControllers = [[NSMutableArray alloc] init];

// UIViewController ONE
MapController *mapController = [[MapController alloc] init];
[tabBarControllers addObject:mapController];
[mapController release];

// UITableView TWO
TableController *rootTableController = [[TableController alloc] init];
UINavigationController *tempNavController = [[UINavigationController alloc] initWithRootViewController:rootTableController];
[rootTableController release];
[tabBarControllers addObject:tempNavController];
[tempNavController release];

[rootController setViewControllers:tabBarControllers];
[tabBarControllers release];

[window addSubview:[rootController view]];
[window makeKeyAndVisible];

EDIT_002:解決方案到目前為止,在app委托中更新UITabBarItems,例如

// TABLE CONTROLLER
TableController *tableController = [[TableController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableController];
[tableController release];
[tabBarControllers addObject:navController];
UITabBarItem *tabBarItem_002 = [navController tabBarItem];
[tabBarItem_002 setTitle:@"TWO"];
[tabBarItem_002 setImage:[UIImage imageNamed:@"GT_TWO.png"]];
[navController release];

EDIT_003:有沒有辦法在UINavigationController中設置UITabBarItem,或者委托(看起來像)真的是最好的地方。

您實際上必須自己創建tabBarItem,然后將其分配給視圖控制器的tabBarItem屬性。 在init中嘗試這個:

UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"TWO"
                                                         image:[UIImage imageNamed:@"GT_TWO.png"]
                                                           tag:0];
self.tabBarItem = tabBarItem;
[tabBarItem release];

希望這可以幫助。

在初始化tableviewcontroller時,它還不是navigationcontroller的一部分。 這就是tabbaritem變量為零的原因。

不確定這是否有效,但您可以配置tableviewcontroller的tabbaritem。 有點運氣,封閉的navigationcontroller將繼承它。 (這就是它如何與title屬性一起使用)

我采用創建輔助方法的方法在AppDelegate中為我正在進行的項目執行此操作。 它幫助我集中了為標簽欄控制器上的視圖控制器設置圖標和標題的邏輯,並且只需編寫一次。

- (void)setIconAndTitleForViewController:(UIViewController *)viewController iconName:(NSString *)iconName titleKey:(NSString *)titleKey
{
    NSString *iconPath = [[NSBundle mainBundle] pathForResource:iconName ofType:@"png"];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:iconPath];
    viewController.tabBarItem.image = image;
    [image release];
    viewController.title = NSLocalizedString(titleKey, @"");
}

然后你會稱之為:

UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"SomeNibName" bundle:[NSBundle mainBundle]];
[self setIconAndTitleForViewController:viewController iconName:@"AnIcon" titleKey:@"SomeKey"];

然后將視圖控制器添加到UITabBarController上的UIViewControllers數組中。

我有完全相同的問題,發現你的問題是一個非常有用的答案。 但是,我來到了以下解決方案:

  1. 在故事板(或IB管理的標簽欄)中,我將標簽欄項目的標題設置為不是標題,而是設置在所有本地化“Localizable.strings”文件中使用的鍵字符串。 在我的例子中,這是相應的德語文本。 在許多其他情況下,這將是英語,甚至是任何形式的一些唯一鍵。
  2. 我在didFinishLaunchingWithOptions添加了我的應用程序委托:

for (UIViewController *vc in self.window.rootViewController.childViewController) { vc.tabBarItem.title = NSLocalizedString(vc.tabBarItem.title, @"Tab Bar Title"); }

此時,標簽欄已完全加載,所有(最頂層)視圖控制器已完全初始化,但只有第一個選項卡的視圖控制器已完全加載。 viewDidLoad中的任何內容,正如您嘗試過並且我先嘗試過的那樣,並不是很有幫助。 在init方法中設置標題也沒有用,因為故事板會覆蓋這些值。 現在TabBarItems將鍵作為標題,可能看起來不太專業。 但是在這個時間點將它們轉換為本地化的等價物就可以了。

試試這個 -

在頭文件中

@interface yournavController : UIViewController<UITabBarDelegate>

並在init方法中

 self.navigationController.tabBar.delegate=self;
    [self.navigationController.tabBar setTitle:@"TWO"];

希望它會有所幫助

就像Marco說的那樣,你必須實現項目,按照你的意願配置它,然后分配它。 實際上它在Apple文檔中:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM