单击标签栏控制器时如何获取导航栏?

时间:2011-10-18 09:32:59

标签: iphone objective-c

我有一个应用程序,我试图通过代码动态切换tabbar选项卡。标签正确切换。当我单击任何选项卡时,选项卡的didSelectController方法被调用,而我的问题是,当我单击任何选项卡时,我正在执行切换视图的选项卡,其导航栏消失,其tabbar图像和标题也消失。

这是我的代码。在appdelegate:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    NSString *clockswitch = [[NSUserDefaults standardUserDefaults]objectForKey:@"clock"];
    UIViewController *desiredController = nil;
    if ([clockswitch isEqualToString:@"digital"]) {
        desiredController = [[DigitalClockViewController alloc] initWithNibName:@"DigitalClockViewController" bundle:nil ];


    }
    else {
        desiredController = [[AnalogClockViewController alloc]initWithNibName:@"AnalogClockViewController" bundle:nil];


    }
    NSMutableArray *controllersCopy = [self.tabBarController.viewControllers mutableCopy];
     [controllersCopy replaceObjectAtIndex:0 withObject:desiredController];
    self.tabBarController.viewControllers = controllersCopy;

}

3 个答案:

答案 0 :(得分:1)

您的代码正在更改视图控制器在标签栏中的显示顺序,而不是按您的意愿更改所选的视图控制器。这可能导致相同的视图控制器在条形图中出现两次,这可能会产生意想不到的副作用。

使用selectedIndexselectedViewController更改选择。您想要选择一个已经存在的控制器,而不是alloc / init一个新控制器;并且,正如Johannes所说,控制器列表中的条目是UINavigationControllerrootViewController是您班级的实例(isKindOf:)。

答案 1 :(得分:0)

如果您希望标签栏控制器中的每个视图控制器都有一个导航栏,则必须将每个视图控制器“包装”在导航控制器中,然后将导航控制器“包装”到标签栏控制器的viewControllers属性中。你像这样包装它:

UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:desiredController];

答案 2 :(得分:0)

   if ([clockswitch isEqualToString:@"digital"]) 
{
    desiredController = [[DigitalClockViewController alloc] initWithNibName:@"DigitalClockViewController" bundle:nil ];
    navigationController=[[UINavigationController alloc] initWithRootViewController:desiredController];
    [self presentModelViewController:navigationController animated:YES];
    [navigationController release];
    [desired... release];


}
else {
    desiredController = [[AnalogClockViewController alloc]initWithNibName:@"AnalogClockViewController" bundle:nil];

...//same code
}