Mojave+Xcode10环境下NSViewController的viewDidLoad方法未调用问题
问题原因
你在ViewController的自定义构造方法中,调用super.init后直接手动给self.view赋值,这个操作跳过了NSViewController默认的视图加载流程。
NSViewController的默认逻辑是:当你首次访问self.view且view还未被赋值时,系统才会自动调用loadView方法完成视图加载,loadView执行完成后才会触发viewDidLoad回调。你直接在构造阶段就完成了view的赋值,系统会判定你已经手动完成了所有视图加载工作,自然不会再触发loadView和viewDidLoad方法。isViewLoaded仅会判断view属性是否为非空,和是否走了系统标准加载流程无关,所以你看到它返回true是正常的。
修复方案
将view的赋值逻辑从构造方法移到loadView中即可,注意自定义loadView时不要调用super.loadView(),避免触发不必要的默认nib加载逻辑:
class ViewController: NSViewController { public init () { super.init(nibName: nil, bundle: nil) print("2") } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func loadView() { // 手动给view赋值,不需要调用super.loadView() self.view = ConfigView(rect: NSRect(x: 0, y: 0, width: 400, height: 300)) print("3") } override func viewDidLoad() { super.viewDidLoad() print("4") } override func viewWillAppear() { super.viewWillAppear() print("5") } override func viewDidAppear() { super.viewDidAppear() print("6") print("Is loaded: \(isViewLoaded)") } }
修改后控制台输出就会符合预期:1、2、3、4、5、6。
内容的提问来源于stack exchange,提问作者MassMover
相关产品推荐
相关产品推荐

