0

我已经很好地查看了 Apple 文档以及类似的 Stack Overflow 问题,但我不知道为什么我的 navigationController 在使用标签栏时为空。我正在尝试从代码构建大部分应用程序,而不是使用 XIB 来插入导航控制器。

在调试时,我大大简化了我的应用程序,只剩下两个选项卡。一个选项卡包含一个表格视图,当触摸一行时,我期望出现一个详细信息页面(来自 XIB)。应该很简单。尝试推送详细视图时,我发现 self.navigationController 的值为 NULL,当然它不起作用。我完全使用了标签栏,它在单个视图(表格视图)中运行良好。在这种情况下 self.navigationController 有一个值。

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // With Tab Bars

    self.tabBarController = [[UITabBarController alloc] init];

    ViewController *vc1 = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    vc1.tabBarItem.title = @"Words";
    vc1.tabBarItem.image = [UIImage imageNamed:@"tab_feed.png"];

    TextTableViewController *vc2 = [[TextTableViewController alloc] init];
    vc2.tabBarItem.title = @"Text";
    vc2.tabBarItem.image = [UIImage imageNamed:@"tab_live.png"];

    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc1];                             
    NSArray* controllers = [NSArray arrayWithObjects:vc2, navController, nil];
    tabBarController.viewControllers = controllers;
    tabBarController.delegate = self;

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.rootViewController = self.tabBarController;
    [window makeKeyAndVisible];
    return YES;  
}

来自 TextTableViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    TextViewController *detailViewController = [[TextViewController alloc] initWithNibName:@"TextViewController" bundle:nil];  
    Text *text = [[Text alloc] init];
    text = [textArray objectAtIndex:indexPath.row];

    detailViewController.TextID = text.textID;
    NSLog(@"Nav Controller: %@",self.navigationController);
    [self.navigationController pushViewController:detailViewController animated:YES];
    NSLog(@"pushed"); 
}

我还有两个与此问题相关的问题。(1) 这条线的目的是什么。无论是进还是出,它似乎都没有什么区别,并且在 Apple 示例中不存在。

tabBarController.delegate = self;

(2) 当创建一个选项卡数组时,其中一个视图是navigationController。它是哪个选项卡是否重要,或者这应该是一个完全与任何选项卡无关且不可见的不同视图。这是问题所在吗?

4

2 回答 2

2

在回答有关标签栏控制器委托的问题 (1) 时,请参阅 UITabBarControllerDelegate 协议参考。对于标签栏控制器的基本功能,您无需为委托而烦恼。

但是,假设您想做一些特别的事情——例如,保存文档或将界面元素重置为默认值——当用户更改选项卡时。您可以使您的一个类,也许是您的应用程序委托或另一个控制器类,符合 UITabBarControllerDelegate 协议并实现 tabBarController:didSelectViewController:

在您的“答案”中,您询问每个选项卡是否需要自己的 UINavigation 控制器。这是绝对正确的。基本上,每个选项卡都是一个完全独立的层次结构,因此您需要在每个需要一个的选项卡中使用单独的 UINavigation 控制器。

这也应该暗示您在原始帖子中的问题(2)的答案。您需要将导航控制器添加到需要它的特定选项卡中。

于 2012-07-08T23:50:30.020 回答
0

好的,我找到了。UINavigationController 需要包含在 UITabBarController 的相应选项卡中。因此,通过进行这种编码更改(如下),一个新的 UINavigationController 将嵌入到带有 tableview 的选项卡中。

UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc2];                             
NSArray* controllers = [NSArray arrayWithObjects:vc1, navController, nil];

那么这就引出了一个问题:如果您需要多个这样的示例怎么办 - 您是否为每个需要的选项卡创建一个新的 UINavigationController,并将每个选项卡标记为 rootViewController?

于 2012-07-08T20:17:42.270 回答