【发布时间】:2014-05-06 04:02:02
【问题描述】:
对不起,说来话长 -
我有一些关于正确使用导航控制器层次结构的问题。
每个UIViewController 都有一个属性self.navigationController
但并非每个视图控制器都从导航控制器呈现 - 因此该属性可能为 nil。
更是如此 -
一些视图控制器期望能够做到:
[self.navigationController presentViewController:nextViewController];
但如果它本身不包含在导航控制器层次结构中,则该表达式不会做任何事情。
所以视图控制器实习生可以测试它是否嵌入到导航控制器中:
if (self.navigationController == nil)
{
// create a UINavigationController with a root view controller - the next view controller
UINavigationController *nav = [UINavigationController alloc] initWithRootViewController:nextViewController];
[self presentViewController:nav];
}
但这可能会破坏目的 - 因为如果呈现视图控制器不在导航控制器中 - 为什么下一个视图控制器必然需要在导航控制器中。为什么当前视图控制器不这样做:
[self presentViewController:nextViewController];
并跳过导航控制器的创建?
在这些确切的线路上 - 我面临的另一个问题 -
一些视图控制器期望从UINavigationController 呈现 -
因为他们在提供的导航控制器栏中设置了导航项 - 工具栏项、标题等。
如果出于某种原因他们的self.navigationController == nil - 他们如何“将自己”“放入”导航控制器中以确保他们可以访问那些预期的元素???
关于导航控制器问题中的容器视图控制器:
如果您查看股票 iOS 音乐应用程序 - 您可以看到 UITabBarController 嵌入在 UIViewNavigationController 中 - 每个选项卡都是一个单独的视图控制器 - 而每个选项卡都可以“推送”和“弹出”视图控制器本身。
我需要实现类似的效果(但布局不同),所以我创建了一个容器视图控制器,里面有 UITabBar 视图。
然后我在该容器视图控制器中创建了一个演示文稿container 视图
这个容器是每个子视图控制器的视图呈现的地方。(那些是“父视图控制器”的“子视图控制器”) - 这有点绕口令,对此我深表歉意。
标签栏切换 - 父视图控制器交换该容器中的可见视图控制器。
现在每个视图控制器都非常通用 - 他们不知道自己的容器,但希望设置一个 UINavigationController 变量(非零)以设置标题 - 按钮 - 导航项等。
通用黑盒视图控制器如何在导航控制器中“呈现”自身(嵌入)-
容器视图控制器如何设置子视图控制器的navigationController 属性?
【问题讨论】:
标签: ios iphone objective-c uiviewcontroller uinavigationcontroller