WebView中的插件对象被破坏了吗?

时间:2011-03-15 04:05:33

标签: objective-c cocoa plugins webkit webview

这是我的情况:

我写了一个简单的网络浏览器。标签浏览很容易,一旦我绕过概念并想出如何在特定选项卡上执行操作就可以工作。它运作良好,在大多数情况下非常可靠。

然而,一个问题困扰着我,我无法弄清楚它的原因。

假设我打开一个新标签页并导航到YouTube。我点击一个视频,然后加载flash播放器。视频播放,一切正常。我现在创建另一个新选项卡并导航到某个站点。来自youtube播放器的音频完全停止。

当我切换回youtube选项卡时,除了播放器必须完全重新加载之外,页面仍将保持原样,就好像我刚刚重新加载页面一样。这似乎也适用于其他插件类型。

造成这种情况的原因是什么?

垃圾收集未启用,据我所知,我正在正确创建Web视图。是否有一些愚蠢,简单的小东西,我错过了某条线?

2 个答案:

答案 0 :(得分: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视图时,插件将停止运行。

答案 1 :(得分:0)

我遇到了类似的问题,但是有一个关闭并恢复的webView窗口。不幸的是,@ mlwelles的解决方案并没有单独解决问题。

然而解决的问题是在关闭之前从窗口中删除webView(正确的“时间”很重要)。我想出的是这样的:

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;
    }
}