更改 rootViewController 与当前 ModalViewController

Posted

技术标签:

【中文标题】更改 rootViewController 与当前 ModalViewController【英文标题】:Change rootViewController vs. present ModalViewController 【发布时间】:2011-12-10 04:05:41 【问题描述】:

我很难考虑更改应用的根视图控制器与以模态方式呈现新视图控制器的设计权衡。

在什么情况下我应该改变词根,在什么情况下我应该呈现模态?我正在寻找一般的应用程序设计指南。我是否应该始终呈现 modal 并且只建立一次 rootViewController(在 appDelegate 中)?

【问题讨论】:

这个问题还应该考虑UINavigationController 何时更合适。考虑设计对内存的影响也很重要。一般来说,如果你替换,那么你的内存占用是有点静态的,而 push 和 presentingModal 会增加你的内存占用。 【参考方案1】:

呈现模态视图控制器的一个关键方面是,当您关闭模态视图控制器时,您会返回到呈现它的视图。

更改视图(假设您的意思是换出视图)并不一定意味着返回到它所替换的视图的模式。它只是替换它。

【讨论】:

在什么情况下更改 rootViewController 是合适的?从基于导航的应用程序的角度来看,在我看来,总有一个“主”屏幕最终会返回。从这个角度来看,呈现模态似乎总是更可取的选择。 替换根控制器并不常见,但我指的另一种模式是在该控制器中交换视图。考虑向左或向右滑动并在另一个视图中导航。 其他常见的模式是导航控制器。在该模型中,您将另一个视图推送到堆栈上,同时保持上方的导航栏弹出。这与当前模式相反,后者在顶部添加一个视图以获取整个视图并关闭返回 最后是钻孔和返回的表格视图模式。所有这些模式都有一个共同点——小空间,所以你需要展示、推送、钻入,然后关闭、弹出或返回。所有只是变体 我建议您观察其他应用程序(尤其是苹果)以了解这些模式。另请阅读苹果人机界面设计指南【参考方案2】:

设置一个根视图控制器并使用模态控制器、导航控制器、标签栏控制器等,通常认为这是一种更好的做法,然后只是在默认窗口上相互添加新视图及其控制器。

这是因为控制器之间的流程是以分层、有组织、“堆叠”的方式完成的。只需在默认窗口上添加一个视图控制器的视图,就可以真正破坏应用程序的正确“流程”。

简而言之,使用模态控制器或从导航控制器或标签栏等开始几乎总是更好的方法。

【讨论】:

【参考方案3】:

通常您使用模态视图控制器将用户的注意力集中在任务上。当您推送时,用户处于某种导航流程中,但仍然触手可及整个应用程序。他们可能会决定前进或后退,切换到中间的不同选项卡,无论如何。当他们获得模态视图控制器时,他们无法执行任何操作,直到任务完成或取消(模态视图被解除)。

退房 - why does this code use presentModalViewController? (not pushViewController) 也

ios Human Interface Guidelines reg. Modal View Controllers

【讨论】:

【参考方案4】:

这取决于您的应用。如果您正在制作基于导航的应用程序,那么呈现模式是一个好主意。最主要的是 modal 只是替换了根,而不是其他。所以在基于导航的应用中,present modal 将非常有用,可以在根目录下导航视图。

【讨论】:

以上是关于更改 rootViewController 与当前 ModalViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 applicaitonWillEnterForeground 中更改 rootViewController

iOS如何在dismissController时更改rootViewController

如何更改 rootViewController 的视图?

更改 rootViewController 时 UIWindow 导致黑屏

在 RootViewController 中单击按钮更改 DetailViewController

更改窗口 rootViewController 后出现 UITabBarController