【问题标题】:Plugin objects in WebView getting destroyed?WebView 中的插件对象被破坏?
【发布时间】:2011-03-15 04:05:33
【问题描述】:

这是我的情况:

我编写了一个简单的网络浏览器。一旦我围绕这些概念思考并弄清楚如何在特定选项卡上执行操作,选项卡式浏览就很容易开始工作。它运行良好,在大多数情况下都非常可靠。

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

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

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

这是什么原因造成的?

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

【问题讨论】:

    标签: objective-c cocoa plugins webkit webview


    【解决方案1】:

    WebView 上的- (void)setHostWindow:(NSWindow *)hostWindow 方法可能就是您要找的。​​p>

    每当封闭窗口的样式掩码更改时,我在重新加载 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 视图从其窗口中移除时,插件将停止运行。

    【讨论】:

    • 谢谢!那成功了。很难相信这是这么简单的事情。
    【解决方案2】:

    我遇到了类似的问题,但窗口的 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 2018-02-26
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多