iOS 中的视图控制器生命周期和视图生命周期有什么区别?
What is the difference between view controller life cycle and view life cycle in iOS?
阅读一些关于 iOS 开发的教程和书籍我经常遇到术语:UIViewController
生命周期和 UIView
生命周期。我感兴趣:这两个术语之间有 实际 区别吗?
查看 Apple 文档,我发现 viewDidAppear
或 loadView
等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期和 [=15 等方法更正确=] 或 dealloc
作为控制器的生命周期。或者没有这样的分离,当有人谈到视图生命周期时,他实际上是指 UIViewController
生命周期?
两者是不同的概念,因此具有不同的生命周期。
UIViewController
A ViewController 是 MVC architecture 中的 Controller。因此,它负责协调模型(您的数据)和您的视图之间的信息。 UIViewControllers
协调 UIView,并且是屏幕之间导航的一部分(pushViewController
、presentViewController
)。因此它需要知道它什么时候出现在屏幕上。
A UIViewController
有一个非常具体的生命周期,它有可以扩展的方法,这些方法是该生命周期的一部分。这些方法的示例是:
viewDidLoad
、viewWillAppear
、viewDidAppear
、viewWillDisappear
、viewDidDisappear
查看
另一方面,View 在必须出现在屏幕上时不必担心。因此,它有一个完全不同的生命周期:
awakeFromNib
、willMoveToSuperView
、didMoveToSuperView
This methods usually are called in the sequence of the UIViewController's
life cycle。因此,通常 UIView
会响应变化,人们不会认为他们有自己的生命周期。
ViewController 的生命周期只有在 class 扩展 UIViewController
时才有意义,而 UIView
的生命周期只有在扩展 [=23] 时才有意义=].
大多数时候,当人们谈论生命周期时,他们会谈论 UIViewController
生命周期,因为视图通常会响应变化。这些变化的两个例子是:视图改变了它的大小,改变了它的父级。
一旦你完全意识到两个classes之间的区别并将其牢记在心(通过实践)
UIViewController - 本身没有 UI 的 class(虽然不完全正确......见根视图),它的目的是控制视图并做一些相关的事情..它就像警察或交通管制员监管他人。 (意见)。
大多数时候,您创建自己的 UIViewController 的子 class,而 class 往往在
等功能上相当繁重
- 处理逻辑规则何时显示什么视图
- 连接到模型层(关于您的应用正在解决的问题的数据和事实)
- 与其他控制器交互,
UIView - class 表示 一个矩形区域 可以在视觉上进行大量修改,但最重要的是,它在屏幕上是可见的,并且可以有子视图,也是UIViews
。视图被组织成视图层次结构。
大多数时候,您自定义视图,使其成为
- 视觉上令人愉悦
- 通过自动布局处理它的子视图
- 表示您经常需要的特定类型的视觉信息class 更具体的视图class,如标签、文本、按钮等
让新手感到困惑的一点是每个视图控制器都有一个根视图,一个属性 包含一个UIView
实例。通常你会搞不清楚是讨论这个根视图,还是讨论视图控制器。在开发人员之间的因果讨论中,这两个词有时可以互换使用。
控制器和视图都有生命周期,但你不能混淆两者。
ViewController lifecycle 是控制器本身发生的事情,比如它从 nib 文件中唤醒,或者收到低内存警告,但主要是关于它的根视图生机勃勃,它的出现如何消失和死亡..
View Lifecycle 是关于视图如何布局其子视图,以及如何呈现其内容。
我喜欢视觉类比..
简单地想象一个警察有很多五颜六色的长方形纸。警察是控制者,他说什么(视图)显示在屏幕上以及什么时候显示。
controller 和 View 是(Model View Controller)MVC 架构模式的一部分的抽象。我建议你立即学习,这样生命周期混乱的问题是在你的脑海里更加清晰。
添加这些答案并更加关注您的确切问题:
I'm interested: is there an actual difference between these two
terms?
是的,两者之间存在差异,但在您处理 UIViewController's
根 UIView
的上下文中,它们在某种程度上是相关的。
Looking Apple docs I found that methods such as viewDidAppear or loadView is a part of view controller's life cycle, but I think it is more correct to refer them as view life cycle and methods such as initWithNibName or dealloc as controller's life cycle.
这就是它们相关的原因:
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear:
它们都在文档中的响应查看事件下。所以这些是从 UIView
到 UIViewController
的回调,告诉它它的状态。虽然:
loadView
viewDidLoad
不在同一部分(在文档中),它是关于其当前状态的 UIView
requesting/telling UIViewController
。还有这些交互的其他示例,例如:
viewWillLayoutSubviews
viewDidLayoutSubviews
在某种程度上(在您的问题的上下文中),一般答案是:是的,这是两个具有不同特性的不同生命周期,但它们在某种程度上是相关的。 UIViewController
的 didReceiveMemoryWarning
是它们不直接相关的示例。 (我直接说,因为间接地,它可能是 UIViewController
的根 UIView
的罪魁祸首)。
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
阅读一些关于 iOS 开发的教程和书籍我经常遇到术语:UIViewController
生命周期和 UIView
生命周期。我感兴趣:这两个术语之间有 实际 区别吗?
查看 Apple 文档,我发现 viewDidAppear
或 loadView
等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期和 [=15 等方法更正确=] 或 dealloc
作为控制器的生命周期。或者没有这样的分离,当有人谈到视图生命周期时,他实际上是指 UIViewController
生命周期?
两者是不同的概念,因此具有不同的生命周期。
UIViewController
A ViewController 是 MVC architecture 中的 Controller。因此,它负责协调模型(您的数据)和您的视图之间的信息。 UIViewControllers
协调 UIView,并且是屏幕之间导航的一部分(pushViewController
、presentViewController
)。因此它需要知道它什么时候出现在屏幕上。
A UIViewController
有一个非常具体的生命周期,它有可以扩展的方法,这些方法是该生命周期的一部分。这些方法的示例是:
viewDidLoad
、viewWillAppear
、viewDidAppear
、viewWillDisappear
、viewDidDisappear
查看
另一方面,View 在必须出现在屏幕上时不必担心。因此,它有一个完全不同的生命周期:
awakeFromNib
、willMoveToSuperView
、didMoveToSuperView
This methods usually are called in the sequence of the UIViewController's
life cycle。因此,通常 UIView
会响应变化,人们不会认为他们有自己的生命周期。
ViewController 的生命周期只有在 class 扩展 UIViewController
时才有意义,而 UIView
的生命周期只有在扩展 [=23] 时才有意义=].
大多数时候,当人们谈论生命周期时,他们会谈论 UIViewController
生命周期,因为视图通常会响应变化。这些变化的两个例子是:视图改变了它的大小,改变了它的父级。
一旦你完全意识到两个classes之间的区别并将其牢记在心(通过实践)
UIViewController - 本身没有 UI 的 class(虽然不完全正确......见根视图),它的目的是控制视图并做一些相关的事情..它就像警察或交通管制员监管他人。 (意见)。 大多数时候,您创建自己的 UIViewController 的子 class,而 class 往往在
等功能上相当繁重- 处理逻辑规则何时显示什么视图
- 连接到模型层(关于您的应用正在解决的问题的数据和事实)
- 与其他控制器交互,
UIView - class 表示 一个矩形区域 可以在视觉上进行大量修改,但最重要的是,它在屏幕上是可见的,并且可以有子视图,也是UIViews
。视图被组织成视图层次结构。
大多数时候,您自定义视图,使其成为
- 视觉上令人愉悦
- 通过自动布局处理它的子视图
- 表示您经常需要的特定类型的视觉信息class 更具体的视图class,如标签、文本、按钮等
让新手感到困惑的一点是每个视图控制器都有一个根视图,一个属性 包含一个UIView
实例。通常你会搞不清楚是讨论这个根视图,还是讨论视图控制器。在开发人员之间的因果讨论中,这两个词有时可以互换使用。
控制器和视图都有生命周期,但你不能混淆两者。
ViewController lifecycle 是控制器本身发生的事情,比如它从 nib 文件中唤醒,或者收到低内存警告,但主要是关于它的根视图生机勃勃,它的出现如何消失和死亡..
View Lifecycle 是关于视图如何布局其子视图,以及如何呈现其内容。
我喜欢视觉类比.. 简单地想象一个警察有很多五颜六色的长方形纸。警察是控制者,他说什么(视图)显示在屏幕上以及什么时候显示。
controller 和 View 是(Model View Controller)MVC 架构模式的一部分的抽象。我建议你立即学习,这样生命周期混乱的问题是在你的脑海里更加清晰。
添加这些答案并更加关注您的确切问题:
I'm interested: is there an actual difference between these two terms?
是的,两者之间存在差异,但在您处理 UIViewController's
根 UIView
的上下文中,它们在某种程度上是相关的。
Looking Apple docs I found that methods such as viewDidAppear or loadView is a part of view controller's life cycle, but I think it is more correct to refer them as view life cycle and methods such as initWithNibName or dealloc as controller's life cycle.
这就是它们相关的原因:
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear:
它们都在文档中的响应查看事件下。所以这些是从 UIView
到 UIViewController
的回调,告诉它它的状态。虽然:
loadView
viewDidLoad
不在同一部分(在文档中),它是关于其当前状态的 UIView
requesting/telling UIViewController
。还有这些交互的其他示例,例如:
viewWillLayoutSubviews
viewDidLayoutSubviews
在某种程度上(在您的问题的上下文中),一般答案是:是的,这是两个具有不同特性的不同生命周期,但它们在某种程度上是相关的。 UIViewController
的 didReceiveMemoryWarning
是它们不直接相关的示例。 (我直接说,因为间接地,它可能是 UIViewController
的根 UIView
的罪魁祸首)。
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