【问题标题】:UITabbarcontroller in IOS5 throws UIViewControllerHierarchyInconsistency exceptionIOS5中的UITabbarcontroller抛出UIViewControllerHierarchyInconsistency异常
【发布时间】:2011-09-10 21:44:06
【问题描述】:

我有以下 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>'

【问题讨论】:

    标签: objective-c uitabbarcontroller ios5


    【解决方案1】:

    替换:

    self.view = tabBarController.view;
    

    与:

    [self.view addSubview:tabBarController.view];
    

    这也将向后兼容 IOS3&4。

    【讨论】:

      【解决方案2】:

      在我的代码中有相同的模式(和问题)。乔的解决方案对我不起作用。看看 sn-p,我猜你从 UIViewController 派生了一个类来允许你自定义一些东西。

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

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

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

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

      祝你好运!

      【讨论】:

      • 替换self.view的问题=tabBarController.view;使用 self.view addSubview:tabBarController.view 如下建议是,您的视图控制器层次结构中仍然存在相同的不一致,您已从一个视图控制器获取视图并将其插入到不同的视图控制器中。如果 Apple 加强对这些情况的检查,则此代码将在将来的某个时候失败。查看 iTunes U 上 WWDC 2011 的 session 102 视频了解更多信息。
      • 完全同意马特的观点。从 UITabBarController 而不是 UIViewController 的子类化确实有助于解决问题并保持向后兼容性。
      • @interface SettingsViewController : UITabBarController
      • 我正在解决同样的问题...我还没有完成,但看起来这可能是正确的思考方式。但是,我明白为什么我会感到困惑...... UITabBarController 的文档说 - 就在快速帮助中:“这个类不用于子类化。 相反,你使用它的实例作为 -是提供一个界面,允许用户在不同的操作模式之间进行选择。”文档过时了吗?我正在尝试刷新我写的一年没有碰过的应用程序,我猜这就是我一开始没有对它进行子类化的原因。
      • 是的,事实上,这对我不起作用。也许我做错了,当我更深入地挖掘时,我会发现这确实是正确的方法——但文档说不要这样做,而另一种方法在我自己没有改变任何其他东西的情况下也能奏效代码。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我也遇到过同样的问题。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-24
          • 1970-01-01
          • 2012-01-24
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多