2011-03-15 51 views
1

這是我的情況:WebView中的插件對象被破壞?

我寫了一個簡單的網絡瀏覽器。一旦我將自己的頭圍繞概念並想出如何在特定選項卡上執行操作,選項卡式瀏覽很容易就可以開始工作。它運作良好,在大多數情況下都非常可靠。

然而,一個問題困擾着我,我無法弄清其原因。

比方說,我打開一個新標籤並導航到YouTube。我點擊一個視頻並加載Flash播放器。視頻播放和所有正常工作。我現在創建另一個新選項卡並導航到某個站點。 youtube播放器的音頻完全停止。

當我切換回youtube選項卡時,頁面將全部仍然存在,除非播放器必須完全重新加載,就好像我剛重新加載頁面一樣。這似乎也適用於其他插件類型。

這是什麼造成的?

垃圾收集未啓用,據我所知我正在創建Web視圖。是否有一些愚蠢的,簡單的小東西,我錯過了沿線的某個地方?

回答

1

WebView上的- (void)setHostWindow:(NSWindow *)hostWindow方法可能是您正在尋找的。

每當封閉窗口的syle掩碼改變時,我在WebView重裝中遇到了同樣的問題。包裝調用setStyleMask解決了這一問題,具體如下:

NSWindow *hostWindow = [[NSWindow alloc] init]; 
[self.webView setHostWindow:hostWindow]; 
[[self windowForSheet] setStyleMask:styleMask]; 
[self.webView setHostWindow:nil]; 
[hostWindow release]; 

The documentation for the method是不是恆星,但它確實明確說明一個NSTabView內具有的WebView作爲一個用例:

此方法將接收方的主機窗口設置爲hostWindow。如果Web視圖將臨時從其窗口中刪除,並且您希望Web視圖繼續運行(例如,您不想中斷正在進行的加載),則應用程序應僅使用此方法。由於接收器保留了hostWindow,因此在關閉窗口之前將主機窗口設置爲nil是避免保留循環的責任。

例如,如果您將Web視圖附加到NSTabView對象(如在選項卡式瀏覽器實現中),則可能會調用此方法。當NSTabView對象不在活動選項卡中時,窗口將視圖移出窗口,因此在Web視圖從其窗口中移除之前需要調用此方法。如果您不調用此方法,那麼當Web視圖從其窗口中移除時,插件將停止操作。

+0

謝謝!那就是訣竅。很難相信這是如此簡單。 – 2011-07-14 18:36:26

0

我有一個類似的問題,但與關閉和恢復的webView的窗口。不幸的是@mlwelles的解決方案並沒有單獨解決問題。

然而,解決的方法是在關閉之前將窗口視圖從窗口中刪除(適當的「時間」很重要)。我想到的是這樣的:

id contentView; 
id tmpHostWindow; 
[window setDelegate:self]; 

- (BOOL)windowShouldClose:(NSNotification *)notification 
{ 
    // set temporary hostWindow on WebView and remove it from 
    // the closed window to prevent stopping flash plugin 
    // (windowWillClose would be better but that doesn't always work) 

    tmpHostWindow = [[NSWindow alloc] init]; 
    [webView setHostWindow:tmpHostWindow]; 
    [window setContentView:nil]; 
    [contentView removeFromSuperview]; 

    return TRUE; 
} 

- (void)windowDidBecomeKey:(NSNotification *)notification 
{ 
    // restore "hidden" webview 
    // (would be better to do it in applicationShouldHandleReopen 
    // but that seems to be too early (has no effect) 

    if ([window contentView] != contentView) { 
     [window setContentView:contentView]; 
     [webView setHostWindow:nil]; 
     tmpHostWindow = nil; 
    } 
}