根视图控制器和模式对话框

Posted

技术标签:

【中文标题】根视图控制器和模式对话框【英文标题】:Root view controllers and modal dialogs 【发布时间】:2010-06-11 02:11:36 【问题描述】:

在自定义UIViewController 中,如果我有一个成员UINavigationController,我以self 作为根视图进行初始化,如下所示:

navController = [[UINavigationController alloc] initWithRootViewController:self];

然后显示模式对话框不会隐藏屏幕底部的标签栏。结果是,如果用户在显示模态对话框时切换到不同的选项卡,当他们弹回显示模态对话框的选项卡时,随后对presentModalViewController 的调用根本不会显示模态对话框,即使由于标签切换,我调用了dismissModalViewControllerAnimated

如果我初始化 UINavigationController 而不将 self 设置为根控制器,

navigationController = [[UINavigationController alloc] init];

然后标签栏按预期隐藏。我已经在我的程序中进行了更改,因此这对我来说不再是一个真正的问题,但我不确定我是否理解为什么会发生这种情况。如果导航控制器要显示模式对话框,那么将导航控制器以self 作为根是否被认为是不好的做法?

【问题讨论】:

【参考方案1】:

我从未将 self 添加为根控制器

我总是有一些控制器将 NavigationController.view 添加到自身。 以及应显示在导航层次结构中的第一个 ViewController,然后我将其添加为 rootViewController。这只是“第一页”的另一种说法(一开始所有的命名都会很混乱)。

MyProjectAppDelegate.m 中的示例:

UITableViewController *startScreen = [[UITableViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:startScreen];
[window addSubview:navController.view];

您也不应该将 UINavigationController 与 UITabBarController 混合使用,如果您想在导航控制器“页面”中有一个标签栏,您可以构建一个自定义的 UITabBarController。

这会告诉你http://github.com/wiredbob/NavTab

(我在理解所有这些视图/控制器嵌套自己时遇到了很大的问题,这个项目确实有所作为。你可以说这是我真正学会了如何使用 :DD 为 iPhone/Mac 编程的代码)

【讨论】:

以上是关于根视图控制器和模式对话框的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中常见场景的根视图控制器问题

以编程方式在纵向视图中显示根控制器弹出窗口

导航控制器如何弹出整个堆栈,包括根

交替使用拆分视图控制器和导航控制器作为窗口根视图控制器

根视图控制器和推送

如何使用给定的根视图控制器和初始视图控制器实例化情节提要?