Iphone 我是否滥用UIViewController子类化?

Iphone 我是否滥用UIViewController子类化?,iphone,cocoa-touch,ios,uiview,uiviewcontroller,Iphone,Cocoa Touch,Ios,Uiview,Uiviewcontroller,在试图弄清楚为什么我的应用程序中没有调用ViewWillExample时,我遇到了一个可能是我对UIViewController子类的预期用途的严重误解 根据以下文章和本博客的链接:UIViewController子类化应该只在非常特定的情况下发生。最明显的是直接添加到UIWindow或其他Apple创建的自定义控制器(如UINavigationController)时 我当然对将UIViewController子类的视图添加到其他UIViewController子类的视图中感到内疚 事实上,我

在试图弄清楚为什么我的应用程序中没有调用ViewWillExample时,我遇到了一个可能是我对UIViewController子类的预期用途的严重误解

根据以下文章和本博客的链接:UIViewController子类化应该只在非常特定的情况下发生。最明显的是直接添加到UIWindow或其他Apple创建的自定义控制器(如UINavigationController)时

我当然对将UIViewController子类的视图添加到其他UIViewController子类的视图中感到内疚

事实上,我认为这或多或少是苹果公司实现MVC的全部想法。。。一个VC和下面的其他VC都很高兴地调用了他们的委托方法

如果一个应用程序中有很多视图(根据定义需要控制)来来去去去,并且有很多screenfull,在那篇文章中描述的模型中,每个screenfull应该有一个主VC子类,所有子视图都由自定义控制器控制(恰好控制视图)它们是简单NSObject的子类

在这种情况下,UIViewController只能直接连接到窗口或UINavigationController、UIAbbarController等

在这种情况下,是否保证调用UIVC委托方法?当viewcontroller的视图是另一个VC的子视图时,这与手动调用委托方法有何不同

老实说,这似乎是在浪费时间。ViewDidLoad、ViewDidLoad、viewDidUnload、ViewWillExample、ViewWillExample的自定义实现,更不用说像“视图”这样简单的属性了

所以基本上,要么我完全错了,要么我在白费力气。如果UIViewController子类不能被指望调用ViewWillDisplay,为什么不直接手动调用该方法,然后使用它呢


为什么要复制UIViewController的所有感知功能?

回答标题问题:是。

所以基本上,我要么 完全错了,否则我疯了 鹅追逐

听起来你完全错了。“视图”一词有几个不同但相关的含义:

  • 视图当然是UIView实例或UIView子类的任何对象
  • 在MVC的上下文中,“视图”是集体使用的,我们谈论这个或那个是“视图的责任”,即使“视图”实际上是一组对象
  • 当谈到视图控制器时,控制器管理的“视图”是控制器视图指向的UIView实例,以及它包含的子视图层次结构
听起来你的误解是在最后一点上。视图控制器应该管理单个“屏幕”的内容。如果使用单个视图控制器对象来管理多个视图层次结构,或者使用多个视图控制器来管理同一视图层次结构的不同部分,则使用UIViewController的方式从来都不是预期的,而且可能会导致问题

您提到的方法(-viewDidLoad,-VIEWWILLEXPENCE等)旨在告诉视图控制器其视图层次刚刚加载,即将显示,等等。它们实际上并不是指单个子视图,视图控制器需要为单个子视图提供这些信息是不寻常的。如果已加载视图层次结构,则视图控制器知道该层次结构中的所有内容都已加载

您似乎将这些方法解释为委托方法,但它们不是。委托是一个单独的对象,它允许自定义委托者,而无需子类化
-viewDidLoad
-ViewWillDisplay
是UIViewController的覆盖点的两个示例,UIViewController是一个用于子类化的类。视图控制器对象本身调用这些方法,使子类有机会在控制器生命周期中的一个有趣的点上采取一些行动

如果UIViewController子类不能 被指望调用视图将出现, 为什么不直接调用这个方法呢 手动操作,可以完成吗

仔细看一看,您会发现提供的大部分功能都与在屏幕上显示视图(即视图层次结构)有关,或者与控制器与“容器”视图控制器(如UINavigationController和uitabarcontroller)集成有关。所有这些对于不管理整个屏幕内容的对象都没有用处

有时会在多个屏幕上复制一组视图,在某些情况下,使用与视图控制器本身分离的对象管理这些视图是很有帮助的。我可以看出,由于UIViewController的-viewDidLoad和类似的方法,您可能会很想使用UIViewController,但这些实际上只是UIViewController功能的一小部分。对其中一个对象调用
-presentModalViewController:
意味着什么?或者访问其
navigationController
parentViewController
属性

如果确实希望使用这些方法管理视图控制器视图层次结构的子视图,请创建具有-viewDid[Load | Unload | EXPENCE | ENGINE]和-viewWill[EXPENCE | ENGISE]方法的NSObject子类。您可以创建该类一次,然后根据需要对其进行子类化,并且您的任何“子客户”类都不会包含UIViewController附带的所有额外的、不必要的控制器管理内容

编辑:我想在这里添加一个指向的指针,它为我上面列出的内容提供了很多支持。下面是标题为“视图控制器管理视图层次结构”小节中的相关段落: