Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何在Swift中初始化NSWindowController?_Cocoa_Swift_Appkit - Fatal编程技术网

Cocoa 如何在Swift中初始化NSWindowController?

Cocoa 如何在Swift中初始化NSWindowController?,cocoa,swift,appkit,Cocoa,Swift,Appkit,我想从一个nib文件初始化一个窗口控制器对象,很简单吧?但我就是不能让它工作 根据我以前在ObjC的经验,我写下了以下代码: init() { super.init(windowNibName: "SplitWindowController") } 在应用程序委托文件中,我只需初始化并显示窗口: var myWindowController: MyWindowController = MyWindowController() myWindowController.showWindow

我想从一个nib文件初始化一个窗口控制器对象,很简单吧?但我就是不能让它工作

根据我以前在ObjC的经验,我写下了以下代码:

init()  {
    super.init(windowNibName: "SplitWindowController")
}
在应用程序委托文件中,我只需初始化并显示窗口:

var myWindowController: MyWindowController = MyWindowController()
myWindowController.showWindow(self)
myWindowController.window.makeKeyAndOrderFront(nil)

但是编译器给了我这个错误:
必须调用超类“NSWindowController”的指定初始值设定项。
。根据Swift版本的
NSWindowController
定义,只有3个指定的初始值设定项,即
init()
init(window)
init(coder)
。我不知道下一步该怎么办。我应该从nib文件构建一个
NSCoder
,我不知道该怎么做

NSWindowController
有两个指定的初始值设定项:

init(window: NSWindow!)
init(coder: NSCoder!)
创建子类时,应调用其超类的指定初始值设定项。Xcode的最新版本强制执行这一点。通过内置语言机制(Swift)或通过
NS\u指定的\u初始值设定项
macro(Objective-C)

Swift还要求在重写方便的初始值设定项时调用指定的超类初始值设定项。
从Swift编程指南部分:

如果要重写的初始值设定项是方便的初始值设定项, 您的重写必须从其自身调用另一个指定的初始值设定项 子类,按照上面初始化器链接中描述的规则


在您的情况下,您可能应该重写
init(window:NSWindow!)
并从那里调用super的对应项。

您就快到了。您确实可以以一种与您习惯的Obj-C代码相同的方式重写
init()
,作为一个方便的初始化器:

import Cocoa

class MyWindowController: NSWindowController {

    override convenience init() {
        self.init(windowNibName: "<xib name>")
    }
}

感谢您的解释,我想知道如何从nib文件构造NSWindow对象?我的意思是窗口对象应该从nib文件构造,对吗?如何从nib文件构造窗口?如果您的窗口控制器有一个专用的xib,您可以在文件所有者的身份检查器中将您的子类设置为“自定义类”。请注意,当从xib创建窗口控制器时,如果要在初始值设定项中执行某些特定操作,则必须重写initWithCoder而不是initWithWindow。@weichsel您能详细说明一下吗?我想将NSWindowController子类化,这样子类就知道初始化时要加载什么Nib。在Obc-C中,这是通过从“init”调用“initWithNibName:”来完成的。用Swift怎么做?我也有同样的问题。我找到的最好答案是这里的第二个答案(改为使用类工厂方法):@George see在这里回答您的问题:[子类化NSWindowController][1][1]:我在Xcode 7.3中遇到了一个“初始值设定项不会从其超类重写指定的初始值设定项”错误。删除
override
关键字可以消除错误。@尼古拉斯米亚里,很明显,自从这篇文章撰写以来,苹果已经解决了这个特定的错误。谢谢你记下来!同样改变的是,我们现在必须显式地标记未命名的参数(而不是
init(Int)
,我们现在编写
init(u:Int)
)。
class A {
    init() { }
}

class B: A {
    init(Int) {
        super.init()
    }
    convenience init(String) {
        self.init(5)
    }
}

class C: B {
    convenience init() {
        self.init("5")
    }
}