美文网首页
UIViewController生命周期手动管理

UIViewController生命周期手动管理

作者: dpplh | 来源:发表于2020-06-21 12:31 被阅读0次
配图

前言

在某版本需求中,需要开发一个viewController添加管理多个childController的页面,类似于今日头条,于是有了这篇文章总结一下。

添加childController

let vc1 = ChildVC1()    // 子控制器1
let vc2 = ChildVC2()    // 子控制器2
    
addChild(vc1)           // 添加子控制器到父控制器上
view.addSubview(vc1.view)   // 添加子控制器view到父控制器上
vc1.view.frame = view.bounds    // 设置子控制器view的frame
didMove(toParent: vc1)  // 通知子控制器有父控制器
    
addChild(vc2)
view.addSubview(vc2.view)
vc2.view.frame = view.bounds
didMove(toParent: vc2)

移除childController

vc1.willMove(toParent: nil)     // 通知子控制器即将与父控制器解除
vc1.view.removeFromSuperview()  // 移除子控制器view
vc1.removeFromParent()          // 解除与父控制器的父子关系,会自动调用 vc1.didMove(toParent: nil)

生命周期

当我们addChild(_ childController: UIViewController)时,系统会自动帮我们管理以下的生命周期方法:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}
    
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
}
    
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}
    
override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
}

手动管理

如果我们需要手动管理以上四个方法,重写以下父控制器,返回false,告诉父控制器要手动管理

override var shouldAutomaticallyForwardAppearanceMethods: Bool {
    return false
}

触发

手动管理四个生命周期方法并不是直接调用子类的方法,而是使用以下方法触发

@available(iOS 5.0, *)
open func beginAppearanceTransition(_ isAppearing: Bool, animated: Bool)

@available(iOS 5.0, *)
open func endAppearanceTransition()
  • isAppearing:true - 触发viewWillAppear; false - 触发viewDidDisappear
  • endAppearanceTransition: 会根据我们调用beginAppearanceTransition时,传入的isAppearing来判断触发viewDidAppear | viewDidDisappear

beginAppearanceTransition & endAppearanceTransition 要配对使用

后续

对于childController的更多使用会在后续继续补充...

相关文章

网友评论

      本文标题:UIViewController生命周期手动管理

      本文链接:https://www.haomeiwen.com/subject/iinoxktx.html