iOS——何时创建子 ViewController 与 UIView 子类?
Posted
技术标签:
【中文标题】iOS——何时创建子 ViewController 与 UIView 子类?【英文标题】:iOS -- When to create a child ViewController vs. a UIView Subclass? 【发布时间】:2013-06-20 22:56:47 【问题描述】:也许这是一个愚蠢的问题,但我在 ios 开发过程中遇到过很多次。
有时我会开发一个我想在多个屏幕上使用的视图组件,所以我决定继承UIView
并使其成为我可以在多个地方使用的东西。
然后,我开始向它添加功能。也许它需要响应NSNotification
,或者它应该响应用户触摸。
在某个时候,我开始怀疑我是否真的应该创建一个UIViewController
子类,并将其作为子 ViewController 添加到我的 UI 中。
在向UIView
添加一些行为以及何时创建完整的UIViewController
之间划清界限是否达成共识?
【问题讨论】:
【参考方案1】:您应该在需要处理或控制数据的任何时候使用控制器。视图应该尽可能愚蠢,不知道它们在显示什么,而是在哪里显示。您可以轻松地继承和重用 ViewController。一个很好的例子,假设您需要通过弹出框控制器和模式从整个应用程序中的用户那里检索字符串(或文本)。创建UIViewController
的通用子类,该子类具有带有文本字段和按钮的视图。然后,您可以使用此视图,它是您需要的任何容量的控制器。在弹出框、模态框或其他任何地方重用它(通常通过委托将数据传回)。由于您正在处理数据,因此您不应该使用 UIView 的唯一子类。
根据我的经验,我将UIViewControllers
子类化的频率高于UIViews
。如果您只是在谈论容器或在一般应用程序工作流程中重用视图,我有点难以理解。不管怎样,虽然它应该是一样的。
【讨论】:
美丽。这也是我一直以来的倾向。 促使我发布此内容的案例实际上是针对某些不会被重复使用的内容。它非常特定于特定屏幕。但是,该组件有很多管道,并且真的感觉它需要更好地与 ViewController 分离。 是的,我知道你的意思。为特定情况子类化 UIViewController 并不是一个坏主意,但尽量使它们尽可能通用。就像在我的示例中一样,不要将其命名为ColorNameCollector
或其他名称,因为它只能用于获取颜色。而是将其命名为 StringCollector
。这种方式更通用,可以在需要从用户那里获取字符串时使用,无论它在哪里或如何呈现/使用。【参考方案2】:
我不能告诉你共识,但这是我的看法:
子类 UIView
仅当...
UIView
子类的某些行为
您对布局子视图有特殊需求。不过,大多数布局都可以由 UIViewController
完成。
可能是手势识别器无法完成的特殊触摸处理
子类UIViewController
在所有其他情况下。无论如何,您几乎总是需要一个控制器,用于编写将视图和模型联系在一起的胶水代码,或者用于处理用户交互。因此,Apple 在 UIKit 中很容易让控制器完成所有工作,并使视图尽可能“愚蠢”。例如,嵌套控制器以创建复杂的视图层次结构非常简单,无需拥有单个视图子类。
UIView
的子类化不是我们应该做的第一件事的一个指标是UIView class reference 中标题为“子类化的替代方案”的部分。子类化UIViewController
是首选的一个指标是UIViewController class reference 中没有这样的部分:-)
【讨论】:
@herzbube 你认为这就是为什么我们现在在 IB 中有子 VC 的容器视图吗?这是在场景之间共享部分 UI 的方式吗(例如头像 + 名称 + 状态点)? @allaire 评论对于讨论并没有真正的用处,也并非有意如此。您也许可以在聊天频道中开始讨论以获取意见。话虽如此,我承认 1)我从来没有使用过很多 IB; 2) 几个月以来,我已经与 iOS 开发完全脱节,所以我真的不知道这些天 IB 给开发人员提供了什么,以及 Apple 认为应该如何使用它。也许看一两个技术视频?【参考方案3】:我不时使用嵌入式视图控制器来加载可重用的表视图。我发现它有时很有用,但并非总是如此。两者之间的通信可能很麻烦,例如如果您希望嵌入式控制器与容器通信。委托使它更容易,但仍然很麻烦。如果我没记错的话,它还会限制您使用 iOS 6,iOS 5 及更低版本不支持嵌入式控制器。
如果只是添加方法,您可以使用类别来存储一些额外的方法。我在不想子类化的 NSManagedObjects 上做了很多事情,如果我从数据模型重新生成 NSManagedObject,我不会丢失我的类别中的代码。为我提供了额外的功能,例如计算字段或转换方法,而无需子类化。如果您不需要特定实例的这些方法,只需排除对类别的引用。
尽管 IMO,子类化从来都不是坏事。
【讨论】:
以上是关于iOS——何时创建子 ViewController 与 UIView 子类?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 使用 UITableViewController 创建子菜单
iOS 和 Swift:ViewController 类已定义,但何时将其创建为对象?
Groovyxml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 标签闭包下创建子标签 | 使用 MarkupBuilderHelper 添加 xml 注释 )