gpt4 book ai didi

objective-c - 为什么在替换在 Interface Builder 中创建的 subview 与在代码中创建的 subview 时会出现不同的行为?

转载 作者:行者123 更新时间:2023-12-03 16:43:22 26 4
gpt4 key购买 nike

我在 NSSplitPane 内部有一个 cocoa WebView,作为分割 Pane 的自定义 View 之一的 subview 。这用作某些 HTML 内容的预览。更新预览时平滑过渡

  1. 我从 WebView 制作一个 NSImageView
  2. WebView 替换为 NSImageView
  3. 将新的 html 加载到 WebView
  4. 当 html 加载完成后,将 NSImageView 替换为更新的 WebView

代码的要点是:

来自标题

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

来自类(class)

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

如果在 xib 文件中定义 WebView,并将引用 socket 设置为 previewWebView 和框架,则此代码无法正常工作加载委托(delegate)集。 Web View 最初显示正确,可以正常交换为 ImageView ,但交换回来后不会显示。

如果我在代码中定义 WebView

// 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 使其工作但在界面生成器中定义时可能不同的任何想法?

最佳答案

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

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

[previewWebview setHostWindow:yourWindow];

这会将 WebView 与您的窗口关联起来。如果您从窗口中删除 WebView,则需要执行此操作,否则 WebView 将停止运行。 WebView 将保留您的窗口,因此您应该确保在关闭窗口之前将主机窗口设置为 nil

[previewWebView setShouldUpdateWhileOffscreen:YES];

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

[previewWebView setShouldCloseWithWindow:NO];

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

您可能会发现,如果您专门设置了主机窗口,则不需要执行此操作。

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

关于objective-c - 为什么在替换在 Interface Builder 中创建的 subview 与在代码中创建的 subview 时会出现不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com