windowShouldClose(_ :)委托函数未在代码中调用

时间:2016-03-18 01:25:50

标签: swift cocoa

我目前正在尝试通过Mac Apps书学习Cocoa,其中一个程序有windowShouldClose(_ :)委托功能。但是,当我运行程序时,只要调用此函数,窗口仍将关闭。该程序仍然运行,但窗口关闭。谁能解释为什么会这样?这是我的代码:

import Cocoa

class MainWindowController: NSWindowController, NSSpeechSynthesizerDelegate, NSWindowDelegate {

@IBOutlet weak var textField: NSTextField!
@IBOutlet weak var speakButton: NSButton!
@IBOutlet weak var stopButton: NSButton!

let speechSynth = NSSpeechSynthesizer()

var isStarted: Bool = false {
    didSet {
        updateButtons()
    }
    }

override var windowNibName: String {
    return "MainWindowController"
}

override func windowDidLoad() {
    super.windowDidLoad()
    updateButtons()
    speechSynth.delegate = self
}

//MARK: - Action methods

//get typed-in text as string
@IBAction func speakIt(sender: NSButton){
    let string = textField.stringValue
    if string.isEmpty {
        print("string from \(textField) is empty")
    } else{
        speechSynth.startSpeakingString(string)
        isStarted = true
        }

    }
@IBAction func stopIt(sender: NSButton){
    speechSynth.stopSpeaking()
}

func updateButtons(){
    if isStarted{
        speakButton.enabled = false
        stopButton.enabled = true
    } else {
        speakButton.enabled = true
        stopButton.enabled = false
    }
}

//Mark: NSSpeechSynthDelegate
func speechSynthesizer(sender: NSSpeechSynthesizer, didFinishSpeaking finishedSpeaking: Bool){
    isStarted = false
    print("finished speaking=\(finishedSpeaking)")
}

//Mark: Window Delegate
func windowShouldClose(sender: AnyObject) -> Bool {
    return !isStarted
}
}

谢谢!

4 个答案:

答案 0 :(得分:1)

您需要将主视图控制器设置为NSWindow的代表。

在windowDidLoad中,您可以将self设置为窗口的委托

override func windowDidLoad() {
    super.windowDidLoad()
    updateButtons()
    speechSynth.delegate = self
    self.window.delegate = self
}

答案 1 :(得分:0)

Shripada所说的是正确的,但还有另一个问题。不要忘记从MainWindowController到xib中定义的窗口建立连接,否则窗口出口将不会引用任何内容。

因此,在文件所有者中定义的窗口enter image description here

应该在界面构建器中引用该窗口 enter image description here

答案 2 :(得分:0)

升级到Swift 5后,在我的代码中也没有调用

windowShouldClose()。在以前的版本中,让应用程序委托从NSApplicationDelegate继承就足以接收windowShouldClose()通知(构建在Xcode中)。升级到Swift 5,我必须让我的应用程序委托也继承自NSWindowDelegate以获得通知。该声明将窗口关闭通知恢复到我的应用程序:

class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {

答案 3 :(得分:0)

您的方法签名必须完全匹配。 必须是

windowShouldClose(_:)

_ 很重要。