2

我在其中一个可可WebView作为NSSplitPane拆分窗格的自定义视图之一的子视图。这用作某些 HTML 内容的预览。更新预览时平滑过渡

  1. NSImageViewWebView
  2. 替换WebViewNSImageView
  3. 将新的 html 加载到WebView
  4. html完成加载后替换为NSImageView更新的WebView

这是代码的要点是:

从标题

NSImageView *previewImageView;
NSString *content;
@property (strong) IBOutlet NSView *previewContainer;
@property (strong) IBOutlet WebView *previewWebView;

从班级

- (void)updatePreview
{
    previewImageView = [self imageViewFromWebView:previewWebView];
    [[previewContainer animator] replaceSubview:previewWebView
        with:previewImageView];
    [[previewWebView mainFrame] loadHTMLString:content baseURL:nil];
}

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
    [[previewContainer animator] replaceSubview:previewImageView
        with:previewWebView];
}

WebView如果在文件中定义xib了引用出口设置为previewWebView和帧加载委托集,则此代码无法正常工作。Web 视图最初显示正确,可以交换为图像视图,但是当交换回来时不会显示。

如果我改为定义WebViewin 代码

// inside of viewDidAppear
NSRect frame = [previewContainer frame];
NSRect webViewFrame = NSMakeRect(0, 0, frame.size.width, frame.size.height);
previewWebView = [[WebView alloc] initWithFrame:webViewFrame];
[previewWebView setUIDelegate:self];
[previewWebView setFrameLoadDelegate:self];
[previewWebView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
[previewContainer addSubview:previewWebView];

而不是界面生成器,交换代码按预期工作。关于我如何定义WebView使其工作的代码但在界面构建器中定义时没有什么不同的任何想法?

4

1 回答 1

1

在以编程方式创建对象时,Interface Builder 很有可能WebView使用与默认设置不同的一些设置来归档对象。WebView

您可能应该尝试一些事情:

[previewWebview setHostWindow:yourWindow];

这会将WebView与您的窗口相关联。如果您WebView从窗口中移除 ,这是必需的,否则WebView将停止运行。这WebView将保留您的窗口,因此您应确保nil在关闭窗口之前将主机窗口设置为。

[previewWebView setShouldUpdateWhileOffscreen:YES];

这将确保 Web 视图在屏幕外时实际加载内容。

[previewWebView setShouldCloseWithWindow:NO];

这将防止WebView其主机窗口关闭时“关闭”。如果您不这样做,WebView则将调用其close方法,该方法实质上将其关闭,清除所有内容和缓存并防止再次使用它。我很确定这是您WebView在 Interface Builder 中实例化时的默认设置,因此您要确保它不会发生。

如果您专门设置了主机窗口,您可能会发现不需要这样做。

[previewWebView close]请注意,如果您这样做,您将需要在实际关闭窗口时调用。

于 2012-04-25T04:04:06.190 回答