嵌套的 UIViewController 需要推送到根 UINavigationController

Posted

技术标签:

【中文标题】嵌套的 UIViewController 需要推送到根 UINavigationController【英文标题】:Nested UIViewController needs to push onto root UINavigationController 【发布时间】:2010-11-22 22:47:29 【问题描述】:

我有一个带有 UINavigationController 的应用程序,其中包含一个根 UIViewController 子类 (PagingViewController),它管理并充当水平分页 UIScrollView 的委托。在这个 UIScrollView 的每个页面上,都有一个垂直滚动的 UITableView,每个页面都由自己的 UIViewController 子类(PageViewController)管理。它看起来像这样......

UINavigationController
  PagingViewController (root VC of navigation controller)
    PageViewController (instance 1)
    PageViewController (instance 2)
    PageViewController (instance 3)

  HowToPushThisViewController (this is what I'd like to push onto the current root, PagingViewController, from one of its sub view controllers)

我想做的是,在 PageViewController(UITableView 委托)的 didSelectRowAtIndexPath: 方法中,将新的 UIViewController 推送到 UINavigationController(在 PagingViewController 之上)。

问题是 PageViewController 的 navigationController 属性是 nil,所以我不能把它推到那里。我假设这是 nil,因为它不是直接在 UINavigationController 的堆栈上,而是 包含 由堆栈上 的 PagingViewController 包含。我尝试在将每个 PageViewController 的 navigationController 属性添加到 PagingScrollView 之前设置它,但它似乎是只读的(UINavigationController 如何设置自身?)。

我觉得嵌套的 UIViewControllers 是合理的架构(每个都需要管理并充当其视图的委托),并且想要从子控制器推送导航是合理的,所以我不确定最佳实践用于从嵌套控制器访问和推送。希望有一些简单的东西可以让我忽略访问并推送到根导航控制器。

【问题讨论】:

【参考方案1】:

合理的做法是设置页面视图控制器的parentViewController 属性,但可惜它也是只读的。 Apple 不鼓励自定义视图控制器层次结构(除了支持的带有标签栏、导航和拆分视图控制器的层次结构)。

在您的情况下,我将在 PageViewController 类上定义一个自定义 parentVC 属性,PagingViewController 在实例化其子项时将其设置为自身。然后PageViewControllers 可以通过

访问导航控制器
self.parentVC.navigationController

【讨论】:

或者,覆盖-parentViewController。这似乎允许一些 UIViewController 魔法起作用,包括(我认为)-navigationController。恶心,不过!

以上是关于嵌套的 UIViewController 需要推送到根 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的 UIViewController 需要推送到根 UINavigationController

如何从 UITableView 推送 UIViewController

从导航堆栈推送/弹出uiviewcontroller时如何收到警报

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

从另一个 UIViewController 推送一个 UIViewController - 如何?

推送 UIViewController 崩溃