【问题标题】:addSubview: re-writes the navigation stack?addSubview:重写导航栈?
【发布时间】:2012-10-01 09:06:37
【问题描述】:

我正在开发一个应用,它使用 iOS SDK 中的 View Controller 文档中描述的控制器包含模式。

我已经编写了控制器容器,效果很好。我的控制器基本上包含两个子视图,它同时显示它们,根据用户的操作滑动一个。效果很好。

现在,我想在导航视图中使用这个容器控制器。这是为了让 push segues 发挥作用。实际上,从我包含的控制器中,我希望能够使用导航堆栈,推送一个新控制器,并在用户完成时弹出。

但是,我注意到,如果将导航视图实例化为我的容器控制器作为根容器,事情就会崩溃。

特别是,我注意到了这一点:

在 iOS 文档中,容器控制器调用 addChildController: 然后 addSubview:。这似乎破坏了导航堆栈,因为 push segue 不起作用 - 它的行为类似于模态。我相信这样做是因为 addSubview 重置了导航堆栈。

我通过将 addChildController 和 addSubview 替换为 [self.navigationController pushViewController...] 来确认这一点。我确认这是 addSubview 的问题,因为当我省略对 addChildController 的调用时,我可以重现该问题。

当我这样做时,导航堆栈正常工作。但当然,我的容器控制器没有,因为只有“最近推送”的控制器是可见的。

我这样做是因为在我包含的控制器中,我想将一个新控制器推入堆栈,当用户完成后,我想“弹出”堆栈,而不重新加载“先前的控制器”。

使用模态segue重新加载之前的控制器;使用推送控制器不会。

我找不到关于 addSubview 行为及其对导航堆栈的影响的任何文档。

提前感谢你们提供的任何启示!

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    我很难完全理解你在做什么,但我认为你想做的正是我正在做的。

    我有一个 UINavigationController,它的 rootView 是一个容器 UIViewController。该控制器按照正常方法添加子级。其中一个子视图会推动其他可能弹出的视图。

    如果需要,其中一个推送视图可以向 appDelegate 发送消息,并使其自身成为 rootViewController。一般来说,只要你保持对视图控制器的强引用,你就可以将它从任何“拥有”它的人身上移除,然后用 navigationControllers viewControllers 数组来满足你的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2019-07-16
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多