也许这是一个愚蠢的问题,但我在iOS开发期间已多次碰到它。
有时候我会开发一个我希望在多个屏幕上使用的视图组件,所以我决定将UIView
子类化,并使其可以在多个地方使用。
然后,我开始添加功能。也许它需要响应NSNotification
,或者它应该响应用户触摸。
在某个时刻,我开始想知道我是否真的应该创建一个UIViewController
子类,并将其作为子ViewController添加到我的UI中。
对于在向UIView
添加某些行为与何时创建完整UIViewController
之间划清界限,是否有任何共识?
答案 0 :(得分:4)
我不能告诉你有关共识,但这是我的意见:
仅在......
时子类UIView
UIView
子类UIViewController
来完成。所有其他情况下的子类UIViewController
。无论如何,您几乎总是需要一个控制器,用于编写将视图和模型连接在一起的胶水代码,或者用于处理用户交互。因此,Apple让UIKit轻松让控制器完成所有工作,并尽可能保持视图“愚蠢”。例如,嵌套控制器以创建复杂的视图层次结构非常简单,而无需具有单个视图子类。
继承UIView
的指标不是第一个应该做的事情是UIView class reference中标题为“子类化的替代”的部分。子类化UIViewController
的指标是首选,UIViewController class reference中没有这样的部分: - )
答案 1 :(得分:3)
您应该在需要处理或控制数据的任何时候使用控制器。视图应尽可能愚蠢,不知道它们显示的是什么,而是知道在哪里。您可以轻松地子类化并重用ViewControllers。一个很好的例子,假设您需要通过弹出控制器和模态从整个应用程序中检索用户的字符串(或文本)。创建UIViewController
的通用子类,其具有带文本字段和按钮的视图。然后,您可以以您需要的任何容量使用此视图及其控制器。在popover,modal或其他任何地方重用它(通常通过委托将数据传回)。由于您正在处理数据,因此不应使用UIView的唯一子类。
根据我的经验,我更频繁地UIViewControllers
继承UIViews
。如果您只是在谈论容器或在一般应用程序工作流程中重用视图,那么我有点难以理解。无论哪种方式都应该是相同的。
答案 2 :(得分:0)
我已经使用嵌入式视图控制器不时加载可重用的表视图。我发现它有时很有用,但并不总是如此。两者之间的通信可能很麻烦,就像您希望嵌入式控制器与容器进行通信一样。授权使其更容易但仍然很麻烦。如果我还记得iOS 5及更低版本不支持嵌入式控制器,它也限制你使用iOS 6。
如果只是添加方法,您可以使用类别来存储一些额外的方法。我在NSManagedObjects上做了很多,我不想继承子类,如果我从数据模型中重新生成NSManagedObject,我不会丢失我的类别中的代码。给了我额外的功能,如计算字段或转换方法,而不必子类。如果您不需要针对特定实例的那些方法,则只需排除对该类别的引用。
尽管IMO,子类化从来都不错。