首页 > 解决方案 > NSViewController 带/不带 nib

问题描述

我正在向NSViewController图书馆添加一个子类,并试图吃掉我的蛋糕。

MyViewController() (或 init() )的默认实现抛出异常

如果它无法在笔尖或情节提要中找到自己。为了克服这个问题,我必须override loadView() 在代码中创建和分配一个视图。我真正想做的是两者,在代码中创建一个视图,但只有在超级实现在 nib 中找不到一个的情况下才运行该代码。我试过一个

    do  {
        super.loadView()
        }
    catch{
        //viewCreatingCode
        } 

但不幸的是 loadView 没有被标记为 throws 所以 catch 不起作用。有任何想法吗?

标签: appkitnsviewcontroller

解决方案


好的,这就是您要执行的操作。

NSViewController具有您要检查的三个属性:nibBundlenibNamestoryboard。所有这三个属性都是可选的,它们是在loadView调用之前设置的。

loadView检查是否设置了这些属性的默认实现。如果是这样,它将从该笔尖或情节提要初始化视图。否则,它会创建一个空的NSView.

在您的实现中loadView,您也需要检查这些值。如果nibNamestoryboardare both nil,您可以创建和设置您想要的视图。

override func loadView() {
    guard nibName == nil, storyboard == nil else {
        super.loadView()
        return
    }
    view = MyCustomView()
}

推荐阅读