为了账号安全,请及时绑定邮箱和手机立即绑定

了解IOS UIViewController生命周期

了解IOS UIViewController生命周期

iOS
红糖糍粑 2019-06-10 20:40:34
了解IOS UIViewController生命周期您能否解释一下如何正确地管理UIViewController生命周期?特别是,我想知道如何使用Initialize, ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappear, ViewDidUnload和DisposeMono Touch中的方法UIViewController班级,等级。
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

这是最新的IOS版本(用Xcode 9.3,SWIFT 4.1)。下面是使UIViewController完成。

  • loadView()

  • loadViewIfNeeded()

  • viewDidLoad()

  • viewWillAppear(_ animated: Bool)

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear(_ animated: Bool)

  • viewWillDisappear(_ animated: Bool)

  • viewDidDisappear(_ animated: Bool)

让我来解释所有这些阶段。

1. loadView

此事件创建控制器管理的视图。只有在以编程方式创建视图控制器时才调用它。这使得它成为在代码中创建视图的好地方。

如果子类没有使用nib,那么子类应该在这里创建它们的自定义视图层次结构。不应该直接打电话。

2. loadViewIfNeeded

如果是当前的视图viewController尚未设置,则此方法将加载视图,但请记住,这仅在IOS>=9.0中可用。因此,如果您支持IOS<9.0,那么不要期望它会出现在图片中。

如果尚未设置视图控制器的视图,则加载该视图控制器的视图。

3. viewDidLoad

这个viewDidLoad事件只在视图被创建并加载到内存中时调用,但尚未定义视图的界限。这是初始化视图控制器将要使用的对象的好地方。

在加载视图后调用。对于在代码中创建的视图控制器,这是后加载视图.对于从NIB中未存档的视图控制器,这是在设置视图之后。

4. viewWillAppear

此事件通知viewController每当视图出现在屏幕上时。在此步骤中,视图具有已定义但未设置方向的界限。

当视图即将变得可见时调用。默认什么都不做。

5. viewWillLayoutSubviews

这是生命周期中最后确定界限的第一步。如果您没有使用约束或自动布局,您可能希望在这里更新子视图。这仅在IOS>=5.0中可用。因此,如果您支持IOS<5.0,那么不要期望它出现在图片中。

在调用视图控制器的layoutSubview方法之前调用。子类可以根据需要实现。缺省值是NOP。

6. viewDidLayoutSubviews

此事件通知视图控制器已设置子视图。在设置子视图之后,对其进行任何更改都是一个很好的地方。这仅在IOS>=5.0中可用。因此,如果您支持IOS<5.0,那么不要期望它出现在图片中。

在调用视图控制器的layoutSubview方法之后调用。子类可以根据需要实现。缺省值是NOP。

7. viewDidAppear

这个viewDidAppear事件在屏幕上显示视图后触发。这使得从后端服务或数据库获取数据成为一个很好的地方。

当视图完全转换到屏幕上时调用。默认什么都不做

8. viewWillDisappear

这个viewWillDisappear事件在呈现视图时触发viewController即将消失、解散、掩盖或隐藏在他人后面viewController..这是一个很好的地方,您可以限制您的网络调用,使计时器无效,或者释放绑定到它的对象。viewController.

当视图被取消、覆盖或以其他方式隐藏时调用。

9. viewDidDisappear

这是生命周期的最后一步,任何人都可以在呈现视图之后触发此事件。viewController已经消失了,被解雇了,被掩盖了,或者被隐藏了。

在视图被驳回、覆盖或以其他方式隐藏后被调用。默认什么都不做

现在按.苹果在实现此方法时,应记住调用super实施这一具体方法。

如果子类UIViewController,则必须调用此方法的超级实现,即使您没有使用NIB。(为了方便起见,默认的init方法将为您做到这一点,并为这两个方法参数指定nil。)在指定的NIB中,File的所有者代理应该将其类设置为视图控制器子类,并将视图出口连接到主视图。如果使用nib名称调用此方法,则该类‘-loadView方法将尝试加载名称与视图控制器类相同的NIB。如果实际上不存在这样的nib,则必须调用-setView:以前-view调用,或覆盖-loadView方法以编程方式设置视图。

希望这能帮上忙。谢谢。

更新@ThomasW指出内部评论viewWillLayoutSubviewsviewDidLayoutSubviews在加载主视图的子视图时,例如当加载表视图或集合视图的单元格时,也会调用。


查看完整回答
反对 回复 2019-06-10
  • 3 回答
  • 0 关注
  • 761 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信