当窗口关闭时window.beginSheet崩溃
问题描述:
我在Cocoa中使用Swift打开模态表。它显示正常,但是当单击工作表上的按钮时,应用程序将与EXC_BAD_ACCESS一起崩溃。这是我做的,显示从AppDelegate.Swift片:当窗口关闭时window.beginSheet崩溃
var preferencesController: PreferencesController?
@IBAction func showPreferencesWindow(sender: AnyObject) {
if let window = window {
let winController = PreferencesController()
window.beginSheet(winController.window!, completionHandler:
{(mr: NSModalResponse) -> Void in print("Closing: \(mr)")})
}
}
这里是OK按钮点击(一个NSButton在纸张上)的作用:
@IBAction func okButtonClicked(button: NSButton) {
print("OK")
}
当点击这个按钮,应用程序崩溃,即使它没有调用任何代码来实际关闭工作表。
非常感谢!已经尝试了很多东西,这一直令人沮丧。
答
您的设置可能有问题。
1 - 确保“在发射可见”不检查你的PreferencesController窗口
2 - 确保您的按钮被正确连接到动作okButtonClicked
,如果你把它连接到按钮,后重命名功能需要返回IB并重新连接
3 - 如果您不使用它,为什么在AppDelegate
中有一个属性preferencesController
?
Here is a sample project做的事情和你做的事情没有什么不同。
答
我知道这是晚了,但我花了几个小时,这样的问题,并找到原因。
问题是,winController在showPreferencesWindow中定义,并且在方法完成时将被销毁。由于beginSheet不会阻塞线程,这意味着winController几乎立即被销毁。
解决方法是改用全局preferencesController变量。
固定码:
var preferencesController: PreferencesController?
@IBAction func showPreferencesWindow(sender: AnyObject) {
if let window = window {
preferencesController = PreferencesController()
window.beginSheet(preferencesController!.window!, completionHandler:
{(mr: NSModalResponse) -> Void in print("Closing: \(mr)")})
}
}
答
谢谢。我也有它的工作,这里有一个例子:
var layoutPrefWinController: LayoutPrefsSheet?
@IBAction func showLayoutPrefsSheet(sender: AnyObject?) {
if let window = window {
let windowController = LayoutPrefsSheet()
window.beginSheet(windowController.window!, completionHandler: {
(res: NSModalResponse) -> Void in
if res == NSModalResponseOK {
}
else {
}
self.layoutPrefWinController = nil
})
layoutPrefWinController = windowController
}
}