【问题标题】:iOS UIWebView page load observabilityiOS UIWebView 页面加载可观察性
【发布时间】:2013-02-26 22:05:39
【问题描述】:
我很想知道UIWebView 中的页面加载何时完成。我知道didStartLoad/didFinishLoadoutlined in here 之间的“引用计数”方法,它有点适合我,但我对此不太自信。它变得有些毛茸茸的ifs 并且当 Javascript 决定与document.location 对话时仍然表现得很奇怪。我不清楚以下几点:
-
UIWebViewDelegate 对于它应该处理的所有功能,非常简洁并且具有next to none documentation。谁能确认didStartLoad/didFinishLoad 真的只为“框架”调用,这意味着很可能是“框架集/框架”和“iframe”?
- 如何区分上述 DOM 引起的负载和请求重定向(也会产生事件)?
- 我的观察是每个
didStartLoad 前面都有shouldStartLoadWithRequest,重定向除外。这是一种可靠的行为吗?
- 是我遗漏了什么,还是无法知道特定
didStartLoad 发起的请求是什么?因为[[webView request] URL] 给出的唯一上下文总是返回相同的 URL,这是 UIWebView 最初被要求加载的那个。
【问题讨论】:
标签:
ios
uiwebview
uiwebviewdelegate
【解决方案1】:
- 我不能。
- 我不知道。
- 我不知道。
- 我不知道。
有用的答案,对吧?
显然,我认为UIWebViewDelegate 可以(应该?)对UIWebView 中发生的事情更具表现力。
我观察UIWebView活动的尝试是:
- 在加载 iOS 6 时添加观察者:从未调用过观察者。
- 正在尝试:
委托方法示例:
- (void)webViewDidStartLoad:(UIWebView *)webView {
[self.activityIndicator startAnimating];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if (!webView.loading) {
[self.activityIndicator stopAnimating];
}
}
效果很好。
我认为您应该使用您提到的 JavaScript 和 iframe 技巧尝试此代码。
它没有帮助,但您拥有您正在谈论的 JavaScript,您还可以考虑向您的应用发送信号以指示进一步的加载操作正在进行中(例如使用 myApp://didStartLoadingSomethingWithJavascriptDude 和 myApp://didFinishLoadingSomethingWithJavascriptDude 等自定义方案调用 URL)
【解决方案2】:
使用来自shouldStartLoadWithRequest 的UIWebViewNavigationType,至少您可以确定当前加载是来自用户点击还是页面内发生的任何其他事情。知道页面何时确实加载是无济于事的,但是您可以在用户触发新代码之前启动一些代码。这可能会有所帮助,具体取决于您必须在两个页面之间执行的任务的性质。