gpt4 book ai didi

cocoa - 如何在 Swift 中初始化 NSWindowController?

转载 作者:IT王子 更新时间:2023-10-29 05:42:45 24 4
gpt4 key购买 nike

我想从一个 nib 文件初始化一个窗口 Controller 对象,很简单吧?但我就是无法让它工作。

根据之前ObjC的经验,我写下了如下代码:

init()  {
super.init(windowNibName: "SplitWindowController")
}

在应用委托(delegate)文件中,我简单地初始化并显示窗口:

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

但是编译器给我这个错误:必须调用父类(super class)“NSWindowController”的指定初始化程序。而根据Swift版本的NSWindowController定义,只有3个designated初始化器,分别是init(), init(window) 初始化(编码器)。我不知道下一步该怎么做。我应该从一个 nib 文件构建一个 NSCoder 吗,我不知道该怎么做?

最佳答案

你快到了。您确实可以以与您习惯的 Obj-C 代码等效的方式将 init() 重写为方便的初始化程序:

import Cocoa

class MyWindowController: NSWindowController {

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

请注意,您正在 self 上调用 init(windowNibName:),因为 init() 是一个方便的初始化程序,您仍然继承所有来自父类(super class)的初始化器。来自 documentation :

Rule 1: A designated initializer must call a designated initializer from its immediate superclass.

Rule 2: A convenience initializer must call another initializer from the same class.

Rule 3: A convenience initializer must ultimately call a designated initializer.

此外,正如@weichsel 上面提到的,确保将 File's Owner 的类设置为 NSWindowController 的子类(在上面的示例中,这将是 MyWindowController) 然后将其 window 导出连接到窗口本身。

也就是说,我不确定为什么编译器要求添加 override 关键字。虽然 NSWindowControllerNSResponder 的子类,它定义了一个 init(),但下面的代码编译没有问题,即使它实现了一个等效的继承层次结构:

class A {
init() { }
}

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

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

关于cocoa - 如何在 Swift 中初始化 NSWindowController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com