前言
在某版本需求中,需要开发一个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的更多使用会在后续继续补充...
网友评论