2011-02-13 41 views
2

我有一個用Objective-C編寫的Mac客戶端應用程序,該應用程序向用戶提供表格中的html文檔列表,當用戶單擊某行時,它會加載選定的HTML頁面變成一個WebView。Webkit - 監聽器在第二頁加載時失敗

每個HTML頁面都有一個「click」的偵聽器,它調用Objective-C方法。

當應用程序運行並且用戶單擊第一行時,一切正常。 「click」事件被困住了,我的Objective-C方法被成功調用了。

但是,當用戶點擊第二個(或後續)記錄,然後將新的HTML頁面加載到相同的WebView中時,「click」上的監聽器從不觸發。

如果所選擇的記錄是第一個被加載的,它總能正常工作,所以問題不是壞HTML文件。僅供參考,所有文件大致相同。

我在簡單的測試應用程序中解決了這個問題。它可以在這裏下載 - http://dl.dropbox.com/u/160638/Work/TCL/MapTest2.zip

注:測試應用程序輸出一個消息到標準日誌,所以你需要檢查或者在Xcode或Console.app日誌窗口看到Objective-C的方法調用工作(或不)。沿着頂部的按鈕是成對的,首先從本地文件加載,然後將HTML頁面加載爲字符串,然後從網站拉出HTML頁面。

從廣泛的搜索我猜,當我加載第二個HTML頁面到WebView的前一頁被保留在某種程度上,兩個「點擊」聽衆在某種方式衝突?那可能嗎?

任何人都可以推薦一種方法來加載HTML頁面,以便後續加載將工作?有沒有辦法確保先前加載到WebView中的任何頁面在加載第二頁之前完全卸載?

任何建議,你可以作出不勝感激。

Regards

Darren。

+0

我建議你在你的zip文件中刪除build目錄... – Yuji 2011-02-13 14:44:34

回答

3

問題是windowScriptObject對每個HTML文檔都是唯一的。您需要執行

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

每次加載html。此外,請注意,在致電loadHTMLString:baseURL:後,windowScriptObject不會立即可用。只有在HTML準備就緒後才能完成。所以,做

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

不會解決問題。相反,您應該在加載完成後,在視圖的某種委託方法中設置windowScriptObject

現在,給我一部分工資。 (Joking:p)

1

感謝Yuji的正確答案。

的委託方法:

-webView:didClearWindowObject:forFrame: 

例如:

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

此示例通過別處另一個海報是好心給我的,所以感謝他還。