【问题标题】:NSWindowController in Swift. Subclassing and initializing with NibSwift 中的 NSWindowController。使用 Nib 进行子类化和初始化
【发布时间】:2014-08-16 13:52:47
【问题描述】:

在一个测试 Swift 项目中,我继承了 NSWindowController。我的NSWindowController 子类旨在处理特定的 Nib 文件。因此,当我的窗口控制器初始化时,nib 文件由窗口控制器实例自动加载是可取的。在 Objective-C 中,这是通过以下方式实现的:

@implementation MyWindowController

- (id)init {
    self = [super initWithWindowNibName:"MyWindowNib"]
    if (self) {
        // whatever
    }
    return self
}

@end

现在,在 Swift 中这是不可能的:init() 不能调用 super.init(windowNibName:),因为后者不是被声明为指定的初始值设定项,而是NSWindowController 的一种方便声明。

如何在 Swift 中做到这一点?我没有看到直接的方法。

P.S.:我已经看到有关此主题的其他问题,但是,只要我能够理解,解决方案都指向通过调用 init(windowNibName:) 来初始化窗口控制器。请注意,这不是所需的行为。 Window Controller 应该使用init() 进行初始化,并且应该是 Window Controller 自己“拾取”其 Nib 文件并加载它。

【问题讨论】:

    标签: cocoa swift subclass nib nswindowcontroller


    【解决方案1】:

    如果您使用 init() 只是为了调用 super.init(windowNibName:),则可以改用覆盖 windowNibName 变量。

    override var windowNibName: String  {
        get {
            return "MyWindowNib"
        }
    }
    

    那么应该没有必要搞乱初始化程序。

    【讨论】:

    • 在 Swift 4 中,最好这样:覆盖 var windowNibName: NSNib.Name? {get { return NSNib.Name(rawValue: "MyWindowNib") }}
    • @Aarhus88 不起作用:属性 'windowNibName' 类型为 'NSNib.Name?' (又名 'Optional')不能覆盖类型为 'String?' 的属性
    【解决方案2】:

    您可以创建自己的便利初始化程序:

    override convenience init() {
        self.init(windowNibName: "MyWindowNib")
    }
    

    您应该选择替换子类中的所有指定初始化程序,只需在适当的情况下委托给super。授予https://stackoverflow.com/a/24220904/1460929

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多