我对UIViewController包含有疑问。为简单起见,我制作了一个示例项目并定义了SecondViewController类。
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black
NSLog("In second controller")
// Do any additional setup after loading the view.
}
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
NSLog("Transitioning in second controller")
}
}
在第一个控制器中,我执行以下操作:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let secondController = SecondViewController()
addChild(secondController)
view.addSubview(secondController.view)
secondController.view.frame = self.view.bounds
secondController.didMove(toParent: self)
}
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
NSLog("Transitioning in first controller")
}
}
当我运行程序时,它会运行,以下是日志:
2018-09-28 19:11:15.491211+0400 ViewContainment[3897:618645] In second controller
2018-09-28 19:11:17.254221+0400 ViewContainment[3897:618645] Transitioning in first controller
问题:
这是否意味着所有UIViewController通知都将由第一个视图控制器处理,并且没有通知将发送到第二个视图控制器?
将第二个视图控制器中的按钮单击操作添加到第一个视图控制器中的选择器是否安全?
答案 0 :(得分:1)
来自Apple的文档(https://developer.apple.com/documentation/uikit/uicontentcontainer/1621511-willtransition):
如果在自己的对象中重写此方法,请始终在实现的某个时刻调用super,以便UIKit可以将特征更改转发到关联的表示控制器和任何子视图控制器。 视图控制器将特征更改消息转发到其子视图控制器。
因此,请确保您在ViewController
中的函数可以做到这一点:
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
NSLog("Transitioning in first controller")
}
问题2:否。使用协议/委托模式允许子视图控制器中的操作与父视图控制器中的func /方法进行通信。