UINavigationController 的 addChildViewController 和 topViewController 之间的相互作用
Posted
技术标签:
【中文标题】UINavigationController 的 addChildViewController 和 topViewController 之间的相互作用【英文标题】:Interplay between UINavigationController’s addChildViewController and topViewController 【发布时间】:2012-05-09 09:02:22 【问题描述】:我有一个类似于模态视图控制器的东西,我需要显示在我的其他视图控制器上方。我没有使用常规的模态控制器功能(presentViewController:
和朋友),因为我需要更好地控制流程。相反,我使用的是视图控制器包含功能(addChildViewController:
方法组)。
包含功能使代码相当简单。当我需要呈现“模态”视图控制器时,我将它作为子视图添加到视图控制器层次结构中,一切都按预期工作。一个小问题是常规视图控制器包装在导航控制器中。因此,我必须将模态控制器添加为导航控制器的子级,否则它会被导航栏和工具栏覆盖。
现在的问题是,在导航控制器上调用 addChildViewController:
也会将新控制器设置为 topViewController
,就像使用常规 pushViewController:
方法推送控制器一样。这意味着当模态控制器显示时,它下面的常规控制器不会收到外观和旋转回调。
这感觉像是一个错误,还是我遗漏了什么?
【问题讨论】:
【参考方案1】:我遇到了同样的问题。我通过编写自己的自定义视图控制器解决了这个问题,其中包含 UINavigationController
(通过 addChildViewController:
添加),然后将 UINavigationController
公开为只读属性。然后,您可以将模态视图控制器添加为新自定义视图控制器的子级,而不是 UINavigationController
的子级
【讨论】:
很糟糕,但我必须这样做。【参考方案2】:我在addChildViewController:
的文档中漏掉了这句话
这个方法只打算被一个实现调用 自定义容器视图控制器。
所以我想这是我的错,这种情况根本不支持。这很糟糕,因为将任何模态事物设计为常规视图控制器并将它们像适当的一等公民一样连接到层次结构非常方便。我可能必须自己重写导航控制器才能获得对此的内置支持。
【讨论】:
这个东西在swift的情况下工作,但是这个在objective-c的情况下不工作。它将它添加为 topviewcontroller以上是关于UINavigationController 的 addChildViewController 和 topViewController 之间的相互作用的主要内容,如果未能解决你的问题,请参考以下文章
在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?
iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?
UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr
关闭 UINavigationController 并呈现另一个 UINavigationController
从嵌入在 UINavigationController 中的一个视图控制器到另一个 UINavigationController