2011-02-13 20 views
2

Objective-Cで書かれたMacクライアントアプリケーションを使用して、ユーザーがテーブル内のHTMLドキュメントのリストを表示し、ユーザーが行をクリックすると選択したHTMLページWebViewに登録します。webkit - リスナーが2ページ目の読み込みで失敗する

すべてのHTMLページには、Objective-Cメソッドを呼び出す「クリック」するリスナーがあります。

アプリケーションが実行され、ユーザーが最初の行をクリックすると、すべて正常に動作します。 "クリック"イベントがトラップされ、Objective-Cメソッドが正常に呼び出されます。

しかし、ユーザーが2番目(またはそれ以降)のレコードをクリックしてから新しいHTMLページが同じWebViewに読み込まれると、「クリック」のリスナーは決して起動しません。

選択したレコードが最初にロードされた場合は、常に正常に動作するため、問題は悪いHTMLファイルではありません。参考までに、すべてのファイルはほぼ同じです。

私は簡単なテストアプリケーションで問題を解決しました。 http://dl.dropbox.com/u/160638/Work/TCL/MapTest2.zip

注:テストアプリケーションはメッセージを標準ログに出力するので、Objective-Cメソッド呼び出しが動作することを確認するには、XcodeまたはConsole.appのログウィンドウをチェックする必要がありますか否か)。一番上のボタンは、ローカルファイルから最初に読み込んだ後、文字列としてHTMLページをロードした後、WebサイトからHTMLページを取得してペアになります。

私は、2番目のHTMLページをWebViewに読み込むと、以前のページが何とか保持され、「クリック」した2人のリスナーが何らかの形で衝突していると推測しています。それは可能ですか?

HTMLページをロードして後続の読み込みがうまくいくように勧められる人はいますか? 2番目のページをロードする前に、以前にWebViewに読み込まれたページが完全にアンロードされるようにする方法はありますか?

お願いしたい提案があれば幸いです。

ありがとうございます。

ダレンです。

+0

zipファイルのビルドディレクトリを削除することをお勧めします。 – Yuji

答えて

3

問題は、windowScriptObjectが各HTMLドキュメントに固有のことです。実行する必要があります

[[[self mapView] windowScriptObject] setValue:self forKey:@"AppDelegate"]; 

htmlが読み込まれるたびに実行する必要があります。また、windowScriptObjectは、loadHTMLString:baseURL:を呼び出した後すぐに利用できないことに注意してください。これは、HTMLが準備されている場合にのみ実行されます。だから、

[[[self mapView] mainFrame] loadHTMLString:htmlString baseURL:nil]; 
[[[self mapView] windowScriptObject] setValue:self forKey:@"AppDelegate"]; 

は解決しません。むしろ、読み込みが完了した後に、ビューの一部の委譲メソッドでwindowScriptObjectを設定する必要があります。

今、あなたの給料の一部を私に与えてください。 (冗談:p)

1

正しい答えはゆうじです。

デリゲートメソッドは次のとおりです。たとえば

-webView:didClearWindowObject:forFrame: 

- (void) webView:(WebView *)sender 
      didClearWindowObject:(WebScriptObject *)windowObject 
      forFrame:(WebFrame *)frame 
{ 
      [windowObject setValue:self forKey:@"AppDelegate"]; 
} 

この例では、親切にも感謝ので彼に、別の場所で別のポスターで私に与えられました。

関連する問題