从UINavigationController设置UITabBarItem标题?

时间:2011-01-10 15:04:23

标签: iphone objective-c cocoa-touch

我已经设置了一个带有两个选项卡的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 delegate中更新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,或者委托(看起来像)真的是最好的地方。

6 个答案:

答案 0 :(得分:10)

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

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

希望这有帮助。

答案 1 :(得分:3)

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

不确定这是否有效,但您可以配置tableviewcontroller的tabbaritem。有点运气,封闭的navigationcontroller将继承它。 (这就是它如何与title属性一起使用)

答案 2 :(得分:2)

我采用创建辅助方法的方法在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数组中。

答案 3 :(得分:0)

试试这个 -

头文件中的

@interface yournavController : UIViewController<UITabBarDelegate>

并在init方法中

 self.navigationController.tabBar.delegate=self;
    [self.navigationController.tabBar setTitle:@"TWO"];
希望它会有所帮助

答案 4 :(得分:0)

就像Marco说的那样,你必须实例化该项目,按照你的意愿配置它,然后分配它。实际上它在Apple文档中:))

答案 5 :(得分:0)

我有完全相同的问题,发现你的问题是一个非常有用的答案。但是,我找到了以下解决方案:

  1. 在故事板(或IB管理标签栏)中,我将标签栏项目的标题设置为不是标题,而是设置在所有本地化“Localizable.strings”文件中使用的键字符串。在我的例子中,这是相应的德语文本。在许多其他情况下,这将是英语,甚至是任何形式的一些唯一键。
  2. didFinishLaunchingWithOptions我的app app delegit中添加:
  3. for (UIViewController *vc in self.window.rootViewController.childViewController) { vc.tabBarItem.title = NSLocalizedString(vc.tabBarItem.title, @"Tab Bar Title"); }

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