2010-03-04 126 views
2

我有一個NSWindow,它承載了一個WebView,我連接到一個腳本處理程序。關閉一個NSWindow

現在,當用戶單擊WebView上的控件上的按鈕時,它會在我的對象上調用Objective C方法。

在此特定情況下,按鈕的作用是嘗試和關閉窗口託管web視圖

[[webView的窗口]密切];

這通常會起作用,但有時由於事件循環嘗試將鼠標消息分派到現在已銷燬的視圖而導致SEGFAULT或其他訪問衝突。

當我嘗試關閉窗口時,調用堆棧太可怕了,偶數循環調用窗口調用了webView,在嘗試關閉窗口時調用了我的腳本委託。通過該對象的回調來破壞對象通常是很危險的,但我無法弄清楚如何安全地關閉用戶與其上的視圖交互的結果。

回答

2

調用堆棧是可怕的,當我嘗試關閉窗口,偶循環調用窗口調用了webView,在嘗試關閉窗口時調用了我的腳本委託。從該對象的回調中銷燬對象通常是危險的,但我無法弄清楚用戶如何與視圖進行交互來安全關閉窗口。

您可以使用performSelector:withObject:afterDelay:推遲關閉窗口,直到按鈕命中後0.0秒。

在這種特定的情況下,該按鈕的作用是嘗試關閉窗口主辦的WebView

[[webView window] close]; 

這通常工作,但有時我得到一個段錯誤或其他一些訪問衝突作爲事件循環的結果嘗試將鼠標消息分派到現在已銷燬的視圖。

這不太可能。事件循環將只爲一個存在的窗口分派事件;如果你已經關閉並因此摧毀了一扇窗戶,那麼任何事件都不能到達該窗口,也不會有任何可能曾經進入過的視野。

如果您編輯問題以包含該崩潰的堆棧跟蹤,將會有所幫助。

+0

好的解決方法,但是它不釋放MainWindow。沒有調用dealloc函數。 – morph85 2015-07-09 09:37:31

5

Istead關閉,你能不能嘗試一下API

- (void)orderOut:(id)sender 

只是檢查你的窗口是否可見和orderout該窗口

if([[webView window] isVisible]) 
    [[webView window] orderOut:self]; 
0

我知道這是一個古老的問題,但我有一個類似的問題,我懷疑接受的答案是缺少重點。我相信託管WebView的窗口仍然是WebView的一個或多個委託,並且在WebView完成加載後(即窗口關閉後)調用委託方法。

我正在尋找正確的方法來解決這個問題...我會繼續尋找。:-)