window.beginSheet在窗口关闭时崩溃

时间:2015-09-10 23:32:24

标签: macos swift cocoa

我在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")
  }

单击此按钮时,应用程序崩溃,即使它没有调用任何代码来实际关闭工作表。

非常感谢;已经尝试过很多东西而且令人沮丧。

3 个答案:

答案 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
}

}