我在滥用UIViewController子类化吗?

| 在试图弄清为什么未在我的应用程序中调用viewWillAppear的过程中,我遇到了关于UIViewController子类的预期用途的严重误解。 根据以下帖子,使用addSubView时viewWillAppear不会运行!以及指向此博客文章的链接:http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/ UIViewController子类化仅应在非常特殊的情况下发生。最显着的是直接添加到UIWindow或其他Apple创建的自定义控制器(如UINavigationControllers)时。 我确实对将UIViewController子类的视图添加到其他UIViewController子类的视图感到内gui。 实际上,我认为这大致上就是苹果实施MVC的全部构想...一个整体VC,下面还有其他VC,所有人都很高兴地调用了其委托方法。 如果应用程序中有很多视图(根据定义需要控制),并且有很多屏幕填充,那么在那篇文章描述的模型中,每个屏幕填充都应该有一个主VC子类,所有子视图都由控制自定义控制器(碰巧控制视图)是简单NSObject的子类。 在这种情况下,UIViewControllers应该仅直接连接到Window还是UINavigationController,UITabBarController等? 您是否可以确保在这种情况下调用UIVC Delegate方法?当视图控制器的视图是另一个VC的子视图时,这与手动调用委托方法有何不同? 老实说,这似乎是在浪费时间。 ViewDidLoad,viewDidLoad,viewDidUnload,viewWillAppear,viewWillDisappear的自定义实现不提及诸如属性之类的简单内容,例如“ view”。 因此,基本上,或者我完全错了,或者我正在追赶野鹅。如果不能依靠UIViewController子类来调用viewWillAppear,为什么不直接手动调用该方法并完成呢? 为什么要复制UIViewController的所有感知功能?     
已邀请:
标题问题的答案:是的。   所以基本上,我要么   完全错误,或者我疯狂   鹅追逐。 听起来您完全错了。术语“视图”具有一些不同但相关的含义: 视图当然是作为UIView实例或UIView的子类的任何对象。 在MVC的上下文中,\“视图\”是一起使用的,尽管“视图”实际上是一组对象,但我们将其称为“视图的责任”。 在谈论视图控制器时,控制器管理的\“ view \”是控制器视图指向的UIView实例及其包含的子视图的层次结构。 听起来您的误解已经到了最后。视图控制器应管理单个“屏幕”内容。如果您要使用一个视图控制器对象来管理多个视图层次结构,或者要使用多个视图控制器来管理同一视图层次结构的不同部分,则使用UIViewController的方式是从来没有打算,这很可能导致问题。 您提到的方法(-viewDidLoad,-viewWillAppear等)旨在告诉视图控制器其视图层次结构刚刚被加载,将要显示等。它们实际上并不是要引用单个子视图,并且需要为视图控制器提供单个子视图的信息是不寻常的。如果已加载视图层次结构,则视图控制器将知道已加载该层次结构中的所有内容。 您似乎将这些方法解释为委托方法,但事实并非如此。委托是一个单独的对象,允许自定义委托人而无需子类化。
-viewDidLoad
-viewWillAppear
是UIViewController的覆盖点的两个示例,UIViewController是用于子类化的类。视图控制器对象本身调用这些方法,以使子类有机会在控制器生命周期的某个有趣的时刻采取一些措施。   如果UIViewController子类不能   被指望调用viewWillAppear,   为什么不只是调用该方法   手动完成吗? 仔细看一下UIViewController,您将看到提供的大多数功能与在屏幕上显示视图(即视图层次结构)或将控制器与“ container \”视图控制器集成在一起有关。例如UINavigationController和UITabBarController。对于不管理整个屏幕内容的对象,这些都没有用。 有时会发生一组视图在多个屏幕上复制的情况,在某些情况下,使用与视图控制器本身不同的对象来管理这些视图很有帮助。我可以看到由于它的-viewDidLoad和类似的方法,您会很想使用UIViewController,但这实际上只是UIViewController的一小部分。在其中一个对象上调用
-presentModalViewController:
是什么意思?还是要访问其“ 3”或“ 4”属性? 如果您确实想使用这些方法来管理视图控制器的视图层次结构的子视图,请创建具有-viewDid [Load | Unload | Appear | Disappear]和-viewWill [Appear | Disappear]方法的NSObject子类。您可以创建该类一次,然后根据需要对其进行子类化,并且所有“ subcontroller”类都不具有UIViewController附带的所有其他不需要的控制器管理内容。 编辑:我想在此处添加指向Apple的iOS的View Controller编程指南的指针,该指南为我在上面列出的内容提供了很多支持。这是标题为“视图控制器管理视图层次结构”的小节中的相关段落:   视图控制器直接   与单个视图对象关联   但是那个物体通常只是根   更大的视图层次结构的视图   也由视图管理   控制器。视图控制器动作   作为中央协调员   视图层次结构,处理交流   在其观点和任何相关方面   控制器或数据对象。一个   视图控制器通常管理   与单个视图关联的视图   屏幕内容的价值,尽管位于   iPad应用程序可能并非总是如此   就是这样。 即使想编写iOS应用程序,任何人都必须阅读《 View Controller编程指南》。如果您有一段时间(或曾经)没有读过它,那么值得回顾。 更新:从iOS 5开始,现在可以定义自己的容器视图控制器,即管理其他视图控制器并可能同时显示多个视图控制器的视图的视图控制器。您可以在上面标题为“创建自定义容器视图控制器”的部分中链接的指南中阅读有关它的更多信息。所有这些都没有真正改变上面的要点:单个视图控制器仍应管理视图的层次结构,像“ 0”之类的方法仍然引用整个视图图,而不是单个子视图。视图控制器管理“整个屏幕”内容的建议不再完全准确-正如自iPad推出以来,“ 6”已同时显示两个视图控制器的内容一样,您自己的容器现在可以显示视图多个子视图控制器。编写容器视图控制器是一个比较高级的主题-在尝试创建自己的容器之前,您应该非常熟悉视图控制器的一般用法以及所提供的容器视图控制器的工作方式。     

要回复问题请先登录注册