15

我有 UITabbar 控制器的以下代码:

NSMutableArray *arr = [[NSMutableArray alloc] init];
tabBarController = [[UITabBarController alloc] init];

FirstViewController *firstview = [[FirstViewController alloc] init];
[tabBarControllerViews addObject:firstview];
[firstview release];

 SecondViewController *secondview = [[SecondViewController alloc] init];
[tabBarControllerViews addObject:secondview];
[secondview release];

[tabBarController setViewControllers:arr animated:YES];
[arr release];

self.view = tabBarController.view;

此代码在 IOS4 上运行良好。我在 IOS5 beta 上尝试过,点击 UITabbarItem 时出现以下错误:

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency',
reason: 'child view controller:<FirstViewController: 0x6e03be0> should have parent view
controller:<MainViewController: 0x6816d20> but actual parent is:<UITabBarController: 0x6b0c110>'
4

4 回答 4

23

代替:

self.view = tabBarController.view;

和:

[self.view addSubview:tabBarController.view];

这也将向后兼容 IOS3&4。

于 2011-09-20T01:08:12.327 回答
6

在我的代码中有相同的模式(和问题)。乔的解决方案对我不起作用。查看代码片段,我猜您从 UIViewController 派生了一个类以允许您自定义某些内容。

这里要做的事情,很简单,是从UITabBarController而不是UIViewController派生,不要创建tabBarController,在任何你引用tabBarController的地方,替换为self。

5 分钟,您不再抛出不一致异常,并且您保持与 iOS 4 的向后兼容。您仍然可以在派生类中进行所有自定义(使用导航控制器进行监控等)。

如果您已经构建了需要使用的 UIViewController 的复杂派生,那么这可能需要更多工作。

一个小问题 - 如果您覆盖 LoadView,您会发现它在 UITabBarController 的初始化期间被调用。在 LoadView 之前很难设置成员,因此您可能需要拆分初始化。

祝你好运!

于 2011-10-07T08:17:29.653 回答
0

我在同样的问题上苦苦挣扎。

当您创建一个新的主从应用程序(没有故事板)时,您可以从 AppDelegate.m 看到以下代码。

 MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

“不依赖于 MainWindow” 只需从您自己的 ViewController 开始并将其设置为委托。并且不要忘记从 MainWindow.xib 取消链接视图,否则视图将被调用 2 次。

于 2011-10-17T06:03:43.683 回答
0

您不能推送或呈现 UITabbarViewController。您的第一个视图控制器是 UITabBarController 吗?

于 2011-09-20T00:53:49.050 回答