为每个视图 iOS 创建单独的视图控制器?

Posted

技术标签:

【中文标题】为每个视图 iOS 创建单独的视图控制器?【英文标题】:Creating individual View Controllers for each view iOS? 【发布时间】:2020-03-08 20:04:58 【问题描述】:

这是一个非常简单的问题,我相信答案是“是的,这是一个最佳实践”,但我只是想问这个问题。

在 Xcode 中的情节提要中创建新视图时,创建单独的自定义视图控制器文件来专门处理每个视图是否是个好主意?

意思是,如果我创建一个名为“登录测验”的新视图,我是否应该创建一个“loginQuizViewController”来处理我为该视图编写的所有代码?

【问题讨论】:

FWIW,按照惯例,类名以大写字母开头,例如LoginQuizViewController. 【参考方案1】:

简答:

是的,每个故事板场景通常都有一个与之关联的唯一视图控制器类。一个视图控制器有一个根view,它又可能在它下面有许多子视图,每个子视图可能还有更多的子视图。这个视图集合统称为“视图层次结构”。


长答案:

是的,每个storyboard “scene” 都有一个与之关联的视图控制器。通常这个视图控制器类是一个特定的UIViewController 子类,它是那个特定的Interface Builder 场景所独有的。但是您不一定必须有一个视图控制器子类,例如,可能会使用现有的类之一(例如,这对于导航控制器场景或标签栏控制器场景并不少见)。

但是,如果您有任何与特定情节提要场景关联的自定义逻辑,那么,是的,您通常会为该特定场景拥有一个独特的视图控制器子类。

两个小说明:

您指的是“测验视图”。

这对于口语来说很好,但为了清楚起见,当我们讨论这个测验的所有内容时,它实际上是一个复杂的视图层次结构,而不仅仅是一个。

单个“测验”场景将与唯一的视图控制器类相关联,并且该视图控制器类的实例将具有单个“根视图”(由 view 属性标识),但 view会有一大堆子视图(例如图像视图、按钮、标签等),其中一些可能有自己的子视图。

所以一个故事板场景有自己独特的视图控制器类,但与整个视图层次结构相关联。

我们经常认为场景及其关联的视图控制器代表您在任何给定时间点可能看到的所有内容,但并不总是一对一的关系。有时您看到的内容是由几个故事板场景及其各自的视图控制器组成的。

例如,如果您使用导航控制器,则导航控制器会处理顶部的导航栏,而您的视图控制器可能会处理导航栏下的所有内容。屏幕上可见的东西就是由这两个视图控制器组成的。

或者,在一个更极端的例子中,我们可以定义自己的view controller containers。在下面的例子中,当我们展示 A 时,我们可以定义屏幕的下半部分由一个完全独立的场景 B 管理,B 有自己的视图控制器:

在这种情况下,A 和 B 都有自己的 IB 场景和各自的视图控制器。通过向 A 场景添加“容器视图”来实现这一点(上面屏幕快照中的浅蓝色 UIView)。

但主要的一点是,您在屏幕上看到的内容可能是由单个故事板场景和视图控制器捕获的,也可能由多个组成。

【讨论】:

谢谢罗伯!这正是我想要的,感谢您花时间为我解释长版本! 没问题。顺便说一句,您可以考虑通过单击其中一个旁边的复选标记来接受答案。 (以后,当您在 S.O. 上获得更多“声誉”时,您也可以对答案进行投票。)见What should I do when someone answers my question? @Rob,我赞成您的出色回答。一个问题:“是的,每个故事板场景通常都有一个与之关联的唯一视图控制器类。”。为什么说“一般”?诚然,每个故事板都有至少一个 VC 并且只有一个入口点,这意味着一个根 (?) VC。但是由于我个人不使用故事板(太老派),所以我错过了你看到的什么场景? TIA。 @dfd - 当我说它“通常有一个独特的视图控制器类”时,我的意思是场景使用的视图控制器在技术上不必是该特定场景所独有的,即它也可以被其他场景使用。例如,您的故事板可能有多个导航栏控制器场景,每个场景都使用UINavigationController。而且,虽然它不是很常见(而且我推荐的情况也不多),但从技术上讲,您也可以重用自己的 UIViewController 子类作为多个 IB 场景的基类。当然 IB 不会禁止它。【参考方案2】:

除了根视图之外,视图控制器可以并且可能包含多个视图。这意味着通常一个视图控制器拥有一个或多个视图,这些视图是它自己的根视图的子视图。这些视图通常也由同一个视图控制器控制。

当来自故事板时,您看到的大多数项目实际上是视图控制器的表示(其他是占位符)。 “登录测验”在概念上听起来像一个屏幕,因此(不知道您的详细信息)创建一个 LoginQuizViewController 可能是有意义的。

【讨论】:

谢谢,这让我明白了很多。我真的很感激!

以上是关于为每个视图 iOS 创建单独的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

每个选项卡都有单独的控制器/视图?

如何从 UITableViewController 转到多个视图控制器

iOS:视图控制器之间的导航

如何在 XCode 中预览故事板的不同视图控制器

iOS 7 及更高版本:为每个视图控制器设置状态栏样式

IOS视图变化