当窗口关闭时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 
} 

}