2015-09-10 146 views
1

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

當點擊這個按鈕,應用程序崩潰,即使它沒有調用任何代碼來實際關閉工作表。

非常感謝!已經嘗試了很多東西,這一直令人沮喪。

回答

0

您的設置可能有問題。

1 - 確保「在發射可見」不檢查你的PreferencesController窗口

2 - 確保您的按鈕被正確連接到動作okButtonClicked,如果你把它連接到按鈕,後重命名功能需要返回IB並重新連接

3 - 如果您不使用它,爲什麼在AppDelegate中有一個屬性preferencesController

Here is a sample project做的事情和你做的事情沒有什麼不同。

0

我知道這是晚了,但我花了幾個小時,這樣的問題,並找到原因。

問題是,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)")}) 
    } 
} 
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 
} 

}