windowWillClose和按钮动作不称为Swift

时间:2018-07-10 10:34:23

标签: swift macos interface-builder nswindowcontroller nstoolbar

我正在使用Xcode 10(测试版)设计一个Mac应用程序,但“偏好设置窗口控制器”出现问题

我的Main.storyboard中有一个自定义类 PreferenceWindowController NSWindowController ,带有工具栏。这是它的连接: all NSWindowController connections

这是完整的课程:

class PreferenceWindowController: NSWindowController, NSWindowDelegate {

@IBAction func didClickAuthor(_ sender: Any) {
    print("author")
}

@IBAction func didClickTypo(_ sender: Any) {
    print("typo")
}

override func windowDidLoad() {
    super.windowDidLoad()
}

func windowWillClose(_ notification: Notification) {
    print("willClose")
}
}

该窗口是通过 AppDelegate 类使用以下代码启动的:

let storyboard = NSStoryboard(name: "Main",bundle: nil)

    if let wc = storyboard.instantiateController(withIdentifier: "PreferenceWindowController") as? PreferenceWindowController
    {
        wc.showWindow(self)
    }

该窗口将按预期打开,工具栏可单击,但根本不会调用PreferenceWindowController的函数,也不会关闭窗口或在工具栏上单击。

我检查了每个连接,每个类名,但我真的不知道怎么了...

解决方案

解决方案是将PreferenceViewController类存储在AppDelegate类中作为变量。

我的解决方案:

var preferenceWindowController:PreferenceWindowController? = nil

@IBAction func clickPreferences(_ sender: Any) {
    if let wc = storyboard.instantiateController(withIdentifier: "PreferencesWindowController") as? PreferenceWindowController {
        let window = wc.window
        preferenceWindowController = wc

        wc.showWindow(self)
    }
}

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

上面的评论似乎可能在正确的轨道上。根据问题中包含的代码上下文,看起来您创建的窗口控制器将对该函数调用仅存在生命期。

尝试使窗口控制器成为实例变量。通常,这就是我在创建窗口控制器的App委托中进行接线的方式。这是一个行之有效的简单模式。