UIView * 视图控制器设计模式

Posted

技术标签:

【中文标题】UIView * 视图控制器设计模式【英文标题】:UIView & UIViewControllers desing pattern 【发布时间】:2012-02-24 21:01:58 【问题描述】:

这是正确的,当 ViewController 在其方法中创建另一个 ViewController 时(比如说 viewDidLoad 或 viewWillAppear)?

在我的例子中 - 我有一个视图 A,它包含其他几个视图 - B 和 C,它们本身就非常复杂,因此为它们设计了特殊的视图控制器 vcB 和 vcC,这些视图控制器是在 vcA 视图中创建的视图 A 的控制器。

这样好吗?例如,如果 vcA 将自己设置为 vcB 的代理会怎样。这意味着,vcB 将保留 vcA。在这种情况下,为了正确释放所有对象,我们需要在某个地方将 vcB 的委托设置为 nil,但是这样做的最佳时机是什么? viewWillDisappear:viewDidDisappear: 或其他。别的?

我确信这不是唯一出现问题的情况,所以我正在寻找您的意见,如何正确设计视图控制器之间的此类交互。

【问题讨论】:

【参考方案1】:

我目睹了一种教条式的坚持,即一次只能运行一个视图控制器。至于我自己,如果它可以简化整体设计(降低复杂性)并使设计管理更容易,我倾向于同时使用多个视图控制器。正如您在recent response that I posted 中看到的那样,在我看来,Apple 通过提供对允许您同时操作多个视图控制器的自定义内容视图控制器的支持,朝着相同的方向发展。

Jonah Williams 的博客值得一读,只是为了了解您可能需要处理的内容。但坦率地说,我反对他的建议没有任何问题。 (那篇文章大约有一年的历史了。)

视图控制器的一个关键功能是保存它所管理的视图的委托方法。视图实际上并不关心什么对象充当它的委托。因此,如果您想要一个与单 VC 观点更和谐的设计,您可以将委托方法放入子类 NSObject 中,而不是将其称为视图控制器。不过,您很可能必须创建 UIViewController 中已有的一些方法。但是您不必将其称为视图控制器。我,我只是继承了一个 UIViewCcontroller。

【讨论】:

【参考方案2】:

通常,您不希望为另一个控制器的子视图使用单独的视图控制器。这不是视图控制器设计的工作方式。

Apple 的导航和标签栏控制器可以做到这一点,但它们非常复杂且不标准(这可能是您不允许对它们进行子类化的原因。)

【讨论】:

以上是关于UIView * 视图控制器设计模式的主要内容,如果未能解决你的问题,请参考以下文章

在自包含的自定义 UIView 子类中使用 .xib 文件进行原型设计

如何在自动布局视图中获取 UIButton 位置

UIView 子视图不会改变方向

从 UIView 加载 UINavigation 控制器

如何复制故事板中设计的 UIView?

故事板中的自定义 UIView