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

Posted

技术标签:

【中文标题】iOS 中常见场景的根视图控制器问题【英文标题】:Root view controller issue for a common scenario in iOS 【发布时间】:2013-06-05 06:57:13 【问题描述】:

我希望我的 ios 应用程序遵循具有主视图的常见模式,在该主视图中需要注册或登录才能访问该应用程序,因此如果这是该应用程序第一次在设备中运行或用户没有登录,即显示的视图,否则显示另一个应用程序视图。主视图中的“注册”和“登录”按钮可以导航到相应的表单,也可以模态显示。一旦用户访问应用程序,它应该是基于标签的,类似于 Twitter 应用程序。

我的问题是:我的rootViewController 应该是什么?如果没有用户凭据,UINavigationController 将主视图推送到哪里,如果有,UITabBarController?或者我应该根据是否有凭据在应用程序委托中动态设置rootViewController

谢谢

【问题讨论】:

您可以将主 UITabBarController 作为根,并在第一页检查登录凭据。如果他们没有,请显示登录视图控制器模式。 @Eric 我需要显示一个带有“登录”和“注册”按钮的主视图,然后是用于请求凭据/用户数据的表单,而不是直接以模态方式显示登录视图跨度> 【参考方案1】:

我推荐第二种解决方案,首先以 root 身份使用登录屏幕,然后在登录时更改 rootViewController。您可以以与模态演示动画相同的方式对其进行动画处理。

【讨论】:

【参考方案2】:

UINavigationController 中嵌入UITabBarController 是违反iOS 设计理念的。我不确定您是否会收到警告或黑屏,但肯定会发生错误。

rootViewController 之间无需切换。 rootViewController 应该是根,在您的情况下,UITabBarController 使用注册登录表单连接到UINavigationControllerviewController。如果有凭据,请跳过该视图。

在根之间切换听起来有点不对劲。如果用户退出怎么办?如果用户有多个帐户并登录和退出怎么办?这是很多不需要的开关。

根据 Apple 的建议,UITabBarController 应该始终是您应用的根视图控制器。更多有趣的阅读:

在标签栏界面中嵌入导航控制器时,您 应该只嵌入 UINavigationController 类的实例,并且 不是作为子类的系统视图控制器 UINavigationController 类。虽然系统提供自定义 用于选择联系人、挑选图像和 实现其他行为,这些视图控制器通常是 旨在以模态方式呈现。有关如何使用 特定的视图控制器,请参阅参考文档 类。

Link

【讨论】:

那么,如果我将UINavigationController 视为rootViewController 而我不使用t change it even if I already have credentials, Ill 将UITabBarController 嵌入其中... 显然我在两者之间切换。编辑了我的答案。 如果我将UITabBarController 保留为rootViewController,我可以在主视图中显示隐藏标签栏的按钮吗? 当然。您可以随时隐藏TabBar 使其看起来像普通视图。如果您遇到困难,请提出一个新问题。 所以...关键是使用“登录”/“注册按钮”设置主视图,就好像它是其中一个选项卡项的视图,但隐藏了选项卡栏?这比切换rootViewController 更合适吗?

以上是关于iOS 中常见场景的根视图控制器问题的主要内容,如果未能解决你的问题,请参考以下文章

在运行时更改 iOS 13 中的根视图控制器

iOS7和iOS8之间的根视图控制器差异

iOS:为啥不显示导航栏?

将场景中的 rootview 更改为视图控制器?

拆分视图控制器中的 iOS 静态页脚

iOS13中具有多个窗口场景的***视图控制器