我在Cocoa中使用Swift打开模态表。它显示正常,但是当单击工作表上的按钮时,应用程序会崩溃并显示EXC_BAD_ACCESS。这是我从AppDelegate.Swift显示工作表的方法:
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)")})
}
}
以下是单击“确定”按钮的操作(工作表上的NSButton):
@IBAction func okButtonClicked(button: NSButton) {
print("OK")
}
单击此按钮时,应用程序崩溃,即使它没有调用任何代码来实际关闭工作表。
非常感谢;已经尝试过很多东西而且令人沮丧。
答案 0 :(得分:1)
我知道情况已经很晚了,但是我花了几个小时解决了这个问题并找到了原因。
问题是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)")})
}
}
答案 1 :(得分:0)
您的设置可能有问题。
1 - 确保"在发布时可见"未检查PreferencesController的窗口
2 - 确保您的按钮已正确连接到操作okButtonClicked
,如果在将其连接到按钮后重命名该功能,则需要返回到IB并重新连接
3 - 如果你没有使用它,为什么preferencesController
中有一个属性AppDelegate
?
Here is a sample project做的几乎和你做的一样,并没有崩溃。
答案 2 :(得分:0)
谢谢。我也得到了它,这是一个例子:
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
}
}