Objective c 在iOS中将视图控制器与视图分开有意义吗?

Objective c 在iOS中将视图控制器与视图分开有意义吗?,objective-c,ios,project-layout,Objective C,Ios,Project Layout,我来自web开发背景,主要从事基于MVC的应用程序,我习惯将代码的组件分为三组文件:控制器、模型和视图 但在iOS应用程序中,即使使用MVC模式,遵循同样的技术是否有意义 UIViewController为您提供了一个默认视图,您可以在其中添加其余子视图(UILabel,UIButton,…),并可以立即访问它们。语言是一样的,它不像必须处理HTML/CSS和其他东西 但我遇到过一些iOS应用程序,UIView被子类化并保存在单独的文件中,即使它只在UIViewController中使用。因此,

我来自web开发背景,主要从事基于MVC的应用程序,我习惯将代码的组件分为三组文件:控制器、模型和视图

但在iOS应用程序中,即使使用MVC模式,遵循同样的技术是否有意义

UIViewController
为您提供了一个默认视图,您可以在其中添加其余子视图(
UILabel
UIButton
,…),并可以立即访问它们。语言是一样的,它不像必须处理HTML/CSS和其他东西

但我遇到过一些iOS应用程序,
UIView
被子类化并保存在单独的文件中,即使它只在
UIViewController
中使用。因此,您必须编写自定义访问器来处理内部子视图


我不认为有必要这样做,当然,除非您在多个地方重复使用相同的
UIView
,或者进行自定义绘图。

通常,我会使用
UIViewController
SingletonManager实际数据源。我更喜欢把东西分开。如果我碰巧有一个自定义的
ui视图
,在这里我自己绘制自定义图形,我会有一个不同的文件,因为这很有意义。即使我只在一个地方使用(你永远不知道明天你会需要什么,你可能碰巧在其他地方需要它)。另外,不要忘记,在iOS中,MVC实际上已经很好地分开了:

  • 笔尖/故事板/自定义图形
  • UIViewController
  • 数据源

在处理iPhone和iOS上相同应用程序之间的差异时,这可能是一个很好的模式。iPad上的DetailViewController可能是iPhone上的UINavigationController


另一种常见模式是,控制器耦合到数据源,而视图与数据源无关,可以在多个控制器中重用。

视图不在视图控制器中,它们要么在单独的类中,要么在视图控制器加载的nib文件中,视图控制器是为该视图编写的,因此它将具有连接到该视图的所有操作和出口

现在,如果您询问如何使用nib或子类,那么在组合和继承之间进行选择也是一样的

如果您需要一个特殊的视图,子类UIView,但是如果您想拥有一个包含控件的视图作为子视图,请使用composition,这样使用Interface Builder来组合视图就更容易了


我认为只有子视图才有UIView子类的唯一原因是为了更好的封装,但是因为您的控制器是专门为视图编写的,所以没有必要进行这种封装。

我们中的许多人都会承认MVC行有点模糊,并且会在控制器中插入少量与视图相关的代码。我个人认为这很好。这并没有减少我们仍然在很大程度上遵循MVC模式的事实(Cocoa类正在为视图做繁重的工作)。但是,对我来说,如果与视图相关的代码扩展到琐碎之外,我会选择将视图子类化

会有人虔诚地将UIView子类化,但我认为有必要采取一点实用主义。如果您添加的是少量与视图相关的代码,那么将其抽象到新的
UIView
子类中是否会提高代码的易读性?不总是这样。但我认为这种情况(有些人可能不需要子类)远不如相反的问题(有些人可能应该子类,却没有子类)常见

所以,你问:

我不认为有必要这样做[将UIView子类化],当然,除非您在多个地方重用相同的UIView或进行自定义绘图

我同意重用和自定义绘图(例如,
drawRect
)是两个很好的例子。但我还要添加一个原则,即如果子类化可以提高代码的易读性,因为视图足够复杂(承认是主观调用),那么我将子类化。两个例子:

  • 我在一个应用程序中有一个日历视图,视图控制器变得笨重,在一个月的不同日期管理所有单元格,等等。因此,通过对
    UIView
    进行子类化,我能够抽象出由日历视图组成的所有子视图的丑陋细节。我不仅将主“月”视图分为子类,还将“月”视图中的“日”视图分为子类。没有重用本身。没有自定义图形。但这显然是正确的做法。代码更加清晰

  • 我越来越多地为我的表视图创建子类
    UITableViewCell
    。在我的第一个项目中,我会让表视图控制器的
    cellforrowatinexpath
    完成该单元格的所有复杂组成和布局。我的代码更容易理解,因为在任何不使用标准单元格类型的情况下,我都会常规地将
    UITableViewCell
    子类化

  • 简言之,虽然我同意人们不应该感到被迫为每个视图控制器为
    UIView
    子类化,但我个人尝试在视图达到某种复杂程度时这样做。我让代码的易读性来管理我的实践。我发现我比以前更多地对视图进行子类化,但决不是我一直都在这样做


    一句话,虽然您不需要一直对视图进行子类化,但我个人认为,许多开发人员在应该对视图(或模型)进行子类化的时候,没有对视图(或模型)进行子类化是有罪的。他们这样做不应该出于遵从MVC的狂热愿望,而是应该问问自己,如果他们对视图或模型进行适当的子类化,他们的代码是否更易于阅读和维护。

    在进行自定义绘图时,似乎也很适合。我正在更新这个问题:)顺便说一句,在