首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在iOS中,视图控制器生命周期和视图生命周期有什么区别?

在iOS中,视图控制器生命周期和视图生命周期有什么区别?
EN

Stack Overflow用户
提问于 2015-02-25 17:20:28
回答 4查看 14K关注 0票数 10

阅读几本关于iOS开发的教程和书籍,我经常会遇到术语:UIViewController生命周期和UIView生命周期。我感兴趣的是:这两个术语之间有实际区别吗?查看Apple,我发现viewDidAppearloadView等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期和将initWithNibNamedealloc等方法称为控制器生命周期更为正确。或者没有这样的分离,当有人谈到视图生命周期时,他实际上是指UIViewController生命周期?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-25 17:39:31

一旦你充分意识到两个类之间的区别,并将它融入你的脑海(通过实践),你的所有困惑就会消失。

UIViewController --一个本身没有UI的类(不是完全真实的though...see根视图),它的目的是控制视图,并做一些相关的stuff..It,就像警察或交通控制器控制其他人一样。(视图)。大多数时候,您都会创建自己的UIViewController子类,而且该类的功能往往很重,例如

  • 处理逻辑规则何时显示哪个视图
  • 连接到模型层(有关应用程序正在解决的问题的数据和事实)
  • 与其他控制人员互动,

UIView --一个表示(矩形区域)的类,它可以被大量视觉化修改,但最重要的事实是,它在屏幕上是可见的,并且可以有子视图,这些子视图也是UIViews。视图被组织成视图层次结构。大多数情况下,您可以自定义视图,使其成为

  • 视觉赏心悦目
  • 通过autolayout处理它的子视图
  • 表示您需要的特定类型的视觉信息,通常子类为更特定的视图类,如标签、文本、按钮等。

让新来者感到困惑的一点是,每个视图控制器都有一个根视图,这是一个包含UIView实例的属性。通常,您可能不知道是否讨论了这个根视图,还是讨论了视图控制器。在开发人员之间的因果讨论中,这两个词有时可以互换使用。

两个控制器和视图都有生命周期,但您不能混淆这两者。

ViewController生命周期是指控制器本身所发生的事情,就像它从nib文件中醒来一样,或者收到内存不足的警告,但主要是关于它的根视图是如何出现的,它是如何消失和死亡的。

视图生命周期是关于视图如何布局它的子视图,以及它如何呈现它的内容。

我喜欢视觉类比..。简单地想象一个警察有很多五颜六色的纸矩形。警察是控制器,他说什么(视图)显示和什么时候在屏幕上。

控制器和视图是模型视图控制器(Model ) MVC体系结构模式的一部分,我建议您立即研究这一点,以便进一步解决生命周期混淆的问题。

票数 18
EN

Stack Overflow用户

发布于 2015-02-25 17:24:09

都是不同的概念,因此具有不同的生命周期。

UIViewController

ViewController是MVC architecture中的控制器。因此,它负责协调模型(数据)和视图之间的信息。UIViewControllers协调UIViews,是屏幕之间导航的一部分(pushViewControllerpresentViewController)。因此,它需要知道何时它将出现在屏幕上。

UIViewController有一个非常特定的生命周期,它有可以扩展的方法,这些方法是该生命周期的一部分。这些方法的例子如下:

viewDidLoadviewWillAppearviewDidAppearviewWillDisappearviewDidDisappear

视图

另一方面,当一个视图出现在屏幕上时,它不应该担心。因此,它有一个完全不同的生命周期:

awakeFromNibwillMoveToSuperViewdidMoveToSuperView

life cycle。因此,通常情况下,UIView会对变化做出响应,人们并不认为自己有一个生命周期。

ViewController的生命周期只有在类扩展UIViewController时才有意义,而UIView的生命周期只有在扩展UIView时才有意义。

大多数情况下,当人们谈论生命周期时,他们会谈论UIViewController生命周期,因为视图通常会响应变化。这些更改的两个示例是:视图更改了其大小,更改了其父视图。

票数 21
EN

Stack Overflow用户

发布于 2015-02-25 23:27:18

添加这些答案,并将更多的注意力放在您的确切问题上:

我感兴趣的是:这两个术语之间有实际区别吗?

是的,两者是不同的,但是在处理UIViewController'sUIView的上下文中,它们在某种程度上是相关的。

查看Apple,我发现viewDidAppear或loadView等方法是视图控制器生命周期的一部分,但我认为将它们称为视图生命周期更正确,而将initWithNibName或dealloc等方法称为控制器生命周期更为正确。

这就是为什么它们是相关的:

  • viewWillAppear
  • viewDidAppear
  • viewWillDisappear
  • viewDidDisappear:

它们都在下,响应文档中的查看事件。因此,这些是从UIViewUIViewController的回调,告诉它它的状态。虽然:

  • loadView
  • viewDidLoad

不在同一部分(在文档中),而是UIView请求/告知UIViewController其当前状态。还有这些交互的其他例子,例如:

  • viewWillLayoutSubviews
  • viewDidLayoutSubviews

在某种程度上(在你的问题的上下文中),一般的答案是:是的,这是两个不同的生命周期,具有不同的特殊性,但它们在某种程度上是相互关联的。UIViewControllerdidReceiveMemoryWarning不是直接相关的例子(我直接说,因为间接地,可能是UIViewController的根UIView是罪魁祸首)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28725481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档