11

也许这是一个愚蠢的问题,但我在 iOS 开发过程中遇到过很多次。

有时我会开发一个我想在多个屏幕上使用的视图组件,所以我会决定子类化UIView并使它成为我可以在多个地方使用的东西。

然后,我开始向它添加功能。也许它需要响应一个NSNotification,或者它应该响应用户的触摸。

在某个时刻,我开始怀疑我是否真的应该创建一个UIViewController子类,并将其作为子 ViewController 添加到我的 UI 中。

UIView在向 a 添加一些行为以及何时创建一个完整的 之间划清界限是否有任何共识UIViewController

4

3 回答 3

5

我不能告诉你共识,但这是我的观点:

子类UIView仅当...

  • 你想做自定义绘图
  • 您需要自定义已经存在的UIView子类的一些行为
  • 您对布局子视图有特殊需求。不过,大多数布局都可以通过 来完成UIViewController
  • 也许对于手势识别器无法完成的特殊触摸处理

所有其他情况下的子类UIViewController。无论如何,您几乎总是需要一个控制器,用于编写将视图和模型联系在一起的胶水代码,或者用于处理用户交互。因此,Apple 在 UIKit 中很容易让控制器完成所有工作并尽可能保持视图“愚蠢”。例如,嵌套控制器以创建复杂的视图层次结构非常简单,而无需拥有单个视图子类。

UIView 类参考中标题为“子类化的替代方案”的部分表明子类UIView化不是人们应该做的第一件事。子类化是首选的一个指标是UIViewController 类参考中没有这样的部分:-)UIViewController

于 2013-06-20T23:54:26.473 回答
5

您应该在需要处理或控制数据的任何时候使用控制器。视图应该尽可能愚蠢,不知道它们在显示什么,而是在哪里显示。您可以轻松地继承和重用 ViewController。一个很好的例子,假设您需要通过弹出框控制器和模式从整个应用程序中的用户那里检索字符串(或文本)。创建一个UIViewController具有文本字段和按钮的视图的通用子类。然后,您可以使用此视图,它是您需要的任何容量的控制器。在弹出框、模态框或其他任何地方重用它(通常通过委托将数据传回)。由于您正在处理数据,因此您不应该使用 UIView 的唯一子类。

根据我的经验,我UIViewControllers更频繁地进行子类化UIViews。如果您只是在谈论容器或在一般应用程序工作流程中重用视图,我有点难以理解。不管怎样,它应该是一样的。

于 2013-06-20T23:21:32.667 回答
0

我不时使用嵌入式视图控制器来加载可重用的表视图。我发现它有时很有用,但并非总是如此。两者之间的通信可能很麻烦,例如如果您希望嵌入式控制器与容器通信。委托使它更容易,但仍然很麻烦。如果我没记错的话,它还会限制您使用 iOS 6,iOS 5 及更低版本不支持嵌入式控制器。

如果只是添加方法,您可以使用类别来存储一些额外的方法。我在 NSManagedObjects 上做了很多我不想子类化的事情,如果我从数据模型重新生成 NSManagedObject,我不会丢失我的类别中的代码。为我提供了额外的功能,例如计算字段或转换方法,而无需子类化。如果您不需要特定实例的这些方法,只需排除对该类别的引用。

尽管 IMO,子类化从来都不是坏事。

于 2013-06-20T23:11:18.480 回答