我在滥用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的所有感知功能?
没有找到相关结果
已邀请:
1 个回复
需复
和
是UIViewController的覆盖点的两个示例,UIViewController是用于子类化的类。视图控制器对象本身调用这些方法,以使子类有机会在控制器生命周期的某个有趣的时刻采取一些措施。 如果UIViewController子类不能 被指望调用viewWillAppear, 为什么不只是调用该方法 手动完成吗? 仔细看一下UIViewController,您将看到提供的大多数功能与在屏幕上显示视图(即视图层次结构)或将控制器与“ container \”视图控制器集成在一起有关。例如UINavigationController和UITabBarController。对于不管理整个屏幕内容的对象,这些都没有用。 有时会发生一组视图在多个屏幕上复制的情况,在某些情况下,使用与视图控制器本身不同的对象来管理这些视图很有帮助。我可以看到由于它的-viewDidLoad和类似的方法,您会很想使用UIViewController,但这实际上只是UIViewController的一小部分。在其中一个对象上调用
是什么意思?还是要访问其“ 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”已同时显示两个视图控制器的内容一样,您自己的容器现在可以显示视图多个子视图控制器。编写容器视图控制器是一个比较高级的主题-在尝试创建自己的容器之前,您应该非常熟悉视图控制器的一般用法以及所提供的容器视图控制器的工作方式。