2015-10-19 118 views
3

如何使用swift處理窗口的關閉事件,例如,詢問「您確定要關閉表單嗎?」在Swift中處理窗口的關閉事件

enter image description here

的形式將的情況下被關閉「是」而不是「不再」封閉。顯示消息框對我來說不是問題。

viewWillDisappear()也適用於最小化,但我只需要關閉事件。

謝謝。

回答

3

您可以在您的ViewController類中使用NSWindowDelegate協議。 (見documentation here

要使類符合協議:

class ViewController: NSObject, NSWindowDelegate 

爲了檢測窗口的關閉按鈕被點擊時,使用windowShouldClose:

從DOC:

告知代表用戶試圖關閉窗口[...]

在這種方法中,您可以使用NSAlert來提示用戶是否真的要關閉窗口。

編輯(響應@Mr比爾茲利的評論)

爲了讓您的ViewController委託,使用:

window.delegate = self 

哪裏self是視圖控制器和window是您正在使用的窗口。你可以把這個放在viewDidLoad:

+0

感謝您的回答。我設置了「類ViewController:NSObject,NSWindowDelegate」並實現了函數windowShouldClose。但它不起作用。我相信我應該爲窗口設置委託屬性,但我不知道如何。 – Evgeniy

+2

要設置從您的視圖控制器委託只是做一些事情:「window.delegate = self」在viewDidLoad(只要你在10.10或更高版本)。您還需要一個參考或IBOutlet到相關窗口。 –

9

就像上面說的那樣,你應該使ViewControllerNSWindowDelegate,但是你應該處理windowWillClose而不是windowShouldClosewindowShouldClose用於確定窗口是否能夠關閉,而不是窗口實際關閉的事件。

我還發現您需要在viewDidAppear中設置delegate,而不是viewDidLoad。對於我self.view.window尚未在viewDidLoad中定義。

override func viewDidAppear() { 
    self.view.window?.delegate = self 
} 
+0

self.view.window?.delegate = self do plz? –

+0

將ViewController設置爲ViewController表示的Window的委託。它允許符合NSWindowDelegate協議的ViewController實際上充當代理。 –

+2

Thx。使用viewDidAppear爲我工作。 – VaporwareWolf

4

我有同樣的查詢也解決了它使用的方法在這裏詳細解釋說:Quit Cocoa App when Window Close using XCode Swift 3

它需要三個步驟:

  1. 順應toNSWindowDelegate在你的ViewController類
  2. 覆蓋viewDidAppear方法
  3. 添加窗口應該關閉方法

所添加的代碼應該是這樣的:

class ViewController: NSViewController, NSWindowDelegate { 
    // ... rest of the code goes here 
    override func viewDidAppear() { 
     self.view.window?.delegate = self 
    } 
    func windowShouldClose(_ sender: Any) { 
     NSApplication.shared().terminate(self) 
    } 
} 
+1

windowShouldClose是一個委託方法,它返回一個布爾值以確定是否允許窗口關閉。你應該使用windowWillClose。您也不需要在代碼中手動終止應用程序。有一個NSApplicationDelegate方法可以放在AppDelegate中,以便在所有窗口關閉時關閉應用程序。 func applicationShouldTerminateAfterLastWindowClosed(_ sender:NSApplication) - > Bool { return true } –