我目前正在尝试通过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
}
}
谢谢!
答案 0 :(得分:1)
您需要将主视图控制器设置为NSWindow的代表。
在windowDidLoad中,您可以将self设置为窗口的委托
override func windowDidLoad() {
super.windowDidLoad()
updateButtons()
speechSynth.delegate = self
self.window.delegate = self
}
答案 1 :(得分:0)
Shripada所说的是正确的,但还有另一个问题。不要忘记从MainWindowController
到xib中定义的窗口建立连接,否则窗口出口将不会引用任何内容。
答案 2 :(得分:0)
windowShouldClose()
。在以前的版本中,让应用程序委托从NSApplicationDelegate继承就足以接收windowShouldClose()
通知(构建在Xcode中)。升级到Swift 5,我必须让我的应用程序委托也继承自NSWindowDelegate
以获得通知。该声明将窗口关闭通知恢复到我的应用程序:
class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
答案 3 :(得分:0)
您的方法签名必须完全匹配。 必须是
windowShouldClose(_:)
_ 很重要。