在UIVIew或UIViewController中进行复杂视图设置?(设计决策)

5
目前我大部分的UI都是以编程方式设置的。有两种方法可以排列屏幕上的视图(除了使用nib之外):
  • 在视图控制器中管理所有视图(它是一个视图控制器!)
  • 创建一个自定义的UIView子类,然后只需在控制器中连接它
我知道两种方法都能够工作,但在哪些情况下您会选择哪种解决方案呢?
此外,对于第一种变体,有一个选项可以在viewDidLoad中完成设置,并将视图添加到self.view中,或者构建一个容器视图并在loadView中添加所有视图。这里也欢迎任何好的建议。
第二个变体接近于使用nib,当您将完整的视图设置为控制器的视图时。
我不想在这里引发宗教战争,只是寻找支持这两种方法的论据。
2个回答

4

我可以想到一些标准来选择使用哪个选项。

如果视图集是或可能成为可重用组件,显示在许多屏幕上,我会更喜欢创建一个UIView子类。

如果视图控制器需要直接访问许多视图,我会在控制器中构建它们。我尝试使自定义UIView类成为不透明容器,因此它们的控制器只需要与父视图交互,而不需要在其子视图中查找。

如果视图集无法呈现处理单个概念的API,例如,如果视图层次结构仅存在于正确设置视图的z-index,并且这些视图处理显示不相关数据,则我会再次在控制器中创建它们。 UIView子类应负责仅显示一组连贯的数据或以一致的方式管理一组子视图。

如果视图需要相对于其层次结构之外的视图定位,我会再次更喜欢在控制器中定义它们。


1

在这种情况下,考虑使用MVC(Modal,View,Controller)。

一个好的选择是创建一个单独的UIView类,并将UIViewController的视图设置为此类(或将其添加为控制器视图的子视图),然后使用委托方法将任何用户交互从您的UIView子类传递给控制器。

但是,如果您计划在控制器的视图中只有一个视图(因此没有交换视图、翻转等),您可以基本上只使用控制器的视图来处理所有UI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接