UINavigationController的问题嵌套在moreViewController中

时间:2012-08-15 08:03:00

标签: iphone ios uinavigationcontroller uitabbarcontroller parentviewcontroller

我有UITabbarMoreController,它包含一些UINavigationControllers。然后,这些UINavigationControllers包含我的自定义视图控制器。

所以层次结构看起来像这样:

UITabbarController
 - UINavigationController
  -> my custom UIViewController
 - ...(other children of UITabbarController look the same)

在我的自定义视图控制器中,我调用[self parentViewController],它应该返回一个UINavigationController。这确实发生了,我确实得到了一个UINavigationController,但是只有当特定的UINavigationController不在moreNavigationController中时才会这样。

由于tabbar控制器中有许多子控制器,因此tabbar控制器会创建一个moreNavigationController。如果我打开一个位于moreNavigationController下的viewcontroller并调用[self parentViewController]它会返回一个带有类UIMoreNavigationController的神秘对象

我真的需要获取UINavigationController,它是我的视图控制器的父节点,而不是UIMoreNavigationController。此外,我尝试使用[self navigationController]具有相同的结果。如何引用我的viewcontroller最真实的父级?提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

简而言之,你不能。

Apple总是试图优化他们的代码。其中一项优化是检查ViewController列表中显示的UIMoreNavigationController是否为UINavigationController类型。因为UIMoreNavigationController本身是一个UINavigationController,所以它不想创建另一个UINavigationController。它试图避免UINavigationController嵌套。

当您查看UIMoreNavigationController的标题文件时,您会注意到它有一个变量 UINavigationController* _originalNavigationController;这是您创建并且想要访问的原始UINavigationController。不幸的是,因为UIMoreNavigationController是私人的,所以你不能这么做。

解决方法(丑陋)

当你将NavigationController推送到它的子堆栈时,将它们的引用传递给它们。