这是我的情况:
我写了一个简单的网络浏览器。标签浏览很容易,一旦我绕过概念并想出如何在特定选项卡上执行操作就可以工作。它运作良好,在大多数情况下非常可靠。
然而,一个问题困扰着我,我无法弄清楚它的原因。
假设我打开一个新标签页并导航到YouTube。我点击一个视频,然后加载flash播放器。视频播放,一切正常。我现在创建另一个新选项卡并导航到某个站点。来自youtube播放器的音频完全停止。
当我切换回youtube选项卡时,除了播放器必须完全重新加载之外,页面仍将保持原样,就好像我刚刚重新加载页面一样。这似乎也适用于其他插件类型。
造成这种情况的原因是什么?
垃圾收集未启用,据我所知,我正在正确创建Web视图。是否有一些愚蠢,简单的小东西,我错过了某条线?
答案 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;
}
}