2

分割ペインのカスタム ビューの 1 つのサブビューとして、WebView内部にココアがあります。NSSplitPaneこれは、一部の HTML コンテンツのプレビューとして機能します。プレビューの更新時に遷移をスムーズにするには

  1. NSImageViewから作るWebView
  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定義され、参照アウトレットが に設定され、フレーム ロード デリゲートが設定されている場合、このコードは正しく機能しません。Web ビューは最初は正しく表示され、イメージ ビューにスワップされますが、元に戻すと表示されません。xibpreviewWebView

WebView代わりにin コードを定義すると

// 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

WebViewプログラムで を作成するときに、Interface Builder がデフォルトとは異なるいくつかの設定でオブジェクトをアーカイブする可能性が非常に高くなりWebViewます。

おそらくいくつかのことを試す必要があります。

[previewWebview setHostWindow:yourWindow];

これにより、 がウィンドウに関連付けられWebViewます。WebViewこれは、ウィンドウからを取り外す場合に必要です。そうしないと、 のWebView動作が停止します。はウィンドウを保持するため、ウィンドウを閉じる前にWebViewホスト ウィンドウを に設定する必要があります。nil

[previewWebView setShouldUpdateWhileOffscreen:YES];

これにより、Web ビューが画面外にあるときにコンテンツを実際に読み込むことが保証されます。

[previewWebView setShouldCloseWithWindow:NO];

WebViewこれにより、ホスト ウィンドウが閉じたときに が「閉じる」ことを防ぎます。これを行わないと、WebViewはそのメソッドを呼び出します。これにより、close本質的にシャットダウンされ、すべてのコンテンツとキャッシュがクリアされ、再び使用されなくなります。Interface Builder でをインスタンス化するときは、これがデフォルトであるとWebView確信しているので、そうならないようにする必要があります。

ホスト ウィンドウを明確に設定している場合は、これを行う必要がないことに気付くかもしれません。

[previewWebView close]これを行う場合、実際にウィンドウを閉じるときに呼び出す必要があることに注意してください。

于 2012-04-25T04:04:06.190 に答える