You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:27:03