我有一个用Objective-C编写的Mac客户端应用程序,它向用户显示一个表格中的html文档列表,当用户点击一行时,它会将选定的HTML页面加载到WebView中。
每个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中时,上一页以某种方式被保留,并且“click”上的两个侦听器以某种方式发生冲突?这可能吗?
任何人都可以推荐一种加载HTML页面的方法,以便后续加载可以工作吗?有没有办法确保在加载第二页之前,先前加载到WebView中的所有页面都已完全卸载?
您可以提出任何建议。
此致
达伦。
答案 0 :(得分: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 :(得分:1)
感谢Yuji的正确答案。
委托方法是:
-webView:didClearWindowObject:forFrame:
例如:
- (void) webView:(WebView *)sender
didClearWindowObject:(WebScriptObject *)windowObject
forFrame:(WebFrame *)frame
{
[windowObject setValue:self forKey:@"AppDelegate"];
}
这个例子在其他地方的另一张海报上给了我好心,所以也感谢他。