从 UINavigationController 设置 UITabBarItem 标题?

Posted

技术标签:

【中文标题】从 UINavigationController 设置 UITabBarItem 标题?【英文标题】:Setting UITabBarItem title from UINavigationController? 【发布时间】:2011-01-10 15:04:22 【问题描述】:

我设置了一个带有两个选项卡的 UITabBarController,一个是简单的 UIViewController,另一个是 UINavigationController,它使用第二个 UIViewController 作为其根控制器(稍后将用于设置 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。但我真的很想在单独的控制器 -init 方法中这样做以保持整洁。

// 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:到目前为止的解决方案,更新应用程序委托中的 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 或者委托(看起来)真的是最好的地方。

【问题讨论】:

【参考方案1】:

您实际上必须自己创建 tabBarItem,然后将其分配给视图控制器的 tabBarItem 属性。在你的初始化中试试这个:

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

希望这会有所帮助。

【讨论】:

self.navigationController.tabBarItem = tabBarItem 对我有用,以防有人想尝试不同的解决方案!【参考方案2】:

在初始化 tableviewcontroller 时,它还不是 navigationcontroller 的一部分。这就是 tabbaritem 变量为 nil 的原因。

不确定这是否有效,但您可以配置 tableviewcontroller 的 tabbaritem。运气好的话,封闭的导航控制器将继承它。 (这就是它与 title 属性的工作方式)

【讨论】:

【参考方案3】:

我采用了在 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 数组中。

【讨论】:

【参考方案4】:

试试这个 -

在头文件中

@interface yournavController : UIViewController<UITabBarDelegate>

在init方法中

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

希望对你有帮助

【讨论】:

【参考方案5】:

正如 Marco 所说,您必须实例化该项目,随意配置它,然后分配它。实际上它在 Apple 文档中 :)

【讨论】:

【参考方案6】:

我有完全相同的问题,发现您的问题是公认的答案非常有帮助。但是,我得出了以下解决方案:

    在情节提要(或 IB 管理的标签栏)中,我将标签栏项目的标题设置为不是它们的标题,而是所有本地化的“Localizable.strings”文件中使用的键字符串。就我而言,这是对应的德语文本。在许多其他情况下,这将是英文键,甚至是任何形式的唯一键。 在didFinishLaunchingWithOptions 中看到我的应用程序代表我补充说:

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

此时,标签栏已完全加载,所有(最顶层的)视图控制器已完全初始化,但只有第一个标签的视图控制器已完全加载。 viewDidLoad 中的任何内容,正如您尝试和我首先尝试的那样,都不是很有帮助。在 init 方法中设置标题也无济于事,因为这些值被故事板覆盖。 现在 TabBarItems 将键作为标题,看起来可能不太专业。但是此时将它们转换为本地化的等效项就可以了。

【讨论】:

以上是关于从 UINavigationController 设置 UITabBarItem 标题?的主要内容,如果未能解决你的问题,请参考以下文章

从 UINavigationController 切换到 UISplitviewController

从UINavigationController中控制UINavigationItem内容

从 UINavigationController 设置 UITabBarItem 标题?

如何从 UINavigationController 隐藏 UINavigationBar?

UINavigationController 内的 UIPageController 从顶部偏移?

从 UiviewController 切换到 UiNavigationController