阅读有关iOS开发的几本教程和书籍我经常会遇到以下术语:UIViewController
生命周期和UIView
生命周期。我很感兴趣:这两个术语之间是否有实际的差异?
查看Apple文档我发现viewDidAppear
或loadView
等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期和方法(例如{{1}更为正确}}或initWithNibName
作为控制器的生命周期。或者没有这样的分离,当有人谈到观看生命周期时,他实际上意味着dealloc
生命周期?
答案 0 :(得分:17)
一旦你完全意识到两个班级之间的差异并将其纳入你的思想(通过实践),你的所有困惑都会消失
UIViewController - 一个本身没有UI的类(尽管不是完全正确的......见根视图),其目的是控制视图并做一些相关的东西......就像一个警察或交通管制员监管他人。 (观点)。 大多数情况下,您创建自己的UIViewController子类,并且该类在功能上往往非常沉重,如
UIView - 一个代表一个矩形区域的类,可以进行大量的视觉修改,但最重要的是,它在屏幕上可见,并且可以有子视图,也是UIViews
。视图按视图层次结构组织。
大多数情况下,您自定义视图以便
让新手感到困惑的一点是每个视图控制器都有一个根视图,这是一个包含UIView
实例的属性。通常,您可能会对是否讨论此根视图或讨论视图控制器感到迷茫。在开发人员之间的因果讨论中,这两个词有时可以互换使用。
控制器和控制器视图有生命周期,但你不能混淆两者。
ViewController生命周期是控制器本身发生的事情,比如它从nib文件中唤醒,或者收到低内存警告,但主要是关于它的根视图如何生命,它如何消失和管芯..
查看生命周期是关于视图如何布置其子视图以及它如何呈现其内容。
我喜欢视觉类比.. 简单地想象一个有很多彩色纸矩形的警察。警察是控制者,他说什么(观点)显示在屏幕上。
控制器和View是(模型视图控制器) MVC架构模式的一部分的抽象。我建议你立即研究,以便在你的脑海中进一步清除生命周期混乱的问题
答案 1 :(得分:15)
两者都是不同的概念,因此具有不同的生命周期。
<强>的UIViewController 强>
ViewController是MVC architecture中的Controller。因此,它负责协调模型(您的数据)和您的视图之间的信息。 UIViewControllers
协调UIViews,并且是屏幕之间导航的一部分(pushViewController
,presentViewController
)。因此,它需要知道它何时出现在屏幕上。
UIViewController
具有非常特定的生命周期,并且它具有可以扩展的方法,这些方法是生命周期的一部分。这些方法的例子是:
viewDidLoad
,viewWillAppear
,viewDidAppear
,viewWillDisappear
,viewDidDisappear
查看强>
另一方面,当一个视图必须出现在屏幕上时,它不应该担心。因此,它具有完全不同的生命周期: awakeFromNib
,willMoveToSuperView
,didMoveToSuperView
This methods usually are called in the sequence of the UIViewController's
life cycle。因此,通常情况下,UIView
会对变化做出响应,人们不会认为自己有自己的生命周期。
ViewController的生命周期仅在类扩展UIViewController
时有意义,而UIView
生命周期仅在扩展UIView
时才有意义。
大多数时候,当人们谈论生命周期时,他们会谈论UIViewController
生命周期,因为View通常会对变化作出反应。这些更改的两个示例是:视图更改了其大小,更改了其父级。
答案 2 :(得分:2)
添加这些答案并更多地关注您的确切问题:
我很感兴趣:这两者之间是否存在实际差异 术语
是的,两者之间存在差异,但在您处理UIViewController's
根UIView
的情况下,它们的方式相关。
查看Apple文档我发现viewDidAppear或loadView等方法是视图控制器生命周期的一部分,但我认为将它们作为视图生命周期和initWithNibName或dealloc等方法作为控制器的生命周期引用更为正确。
这就是他们相关的原因:
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear:
它们都在文档中的响应视图事件下。所以这些是从UIView
到UIViewController
的回调告诉它的状态。虽然:
loadView
viewDidLoad
不在同一部分(在文档中),UIView
请求/告知UIViewController
其当前状态。您还有其他这些交互的示例,例如:
viewWillLayoutSubviews
viewDidLayoutSubviews
在某种程度上(在你的问题的背景下),一般的答案是:是的,那些是具有不同特殊性的两个不同的生命周期,但它们在某种程度上是相关的。它们不直接相关的示例是UIViewController
的{{1}}。 (我直接说,因为间接地,它可能是didReceiveMemoryWarning
的根UIViewController
的罪魁祸首。
答案 3 :(得分:0)
Most of the lifecycle is handled automatically by the
system and no need for calling some methods like parent and child view
controllers relationship
Here are the mentioned lifecycle methods for UIView:
<块引用>
didAddSubview(_:)
willRemoveSubview(_:)
willMove(toSuperView:)
didMoveToSuperview
willMove(toWindow:)
didMoveToWindow