我有一个应用程序,用户可以浏览一堆的本地存储的HTML文件。 我有一个UIWebView
,具有配置正确UIWebViewDelegate
。 通常情况下,当用户打开一个链接时, shouldStartLoadWithRequest
叫,随后webViewDidFinishLoad
晚了一点。
但是,如果该链接指向同一个页面作为当前显示的一个一个锚,只有shouldStartLoadWithRequest
被调用。 webViewDidFinishLoad
不火。
从某种意义上说,我看,这可能是预期的行为,因为在页面导航应该不需要重新加载页面。 可是,我真的需要一个地方挂接到调用堆栈后,页面导航是完整的。 最佳的解决方案将让我知道什么时候任何种类的导航已经结束,无论是从另一个网页,网页内和前进/后退操作。
我最好的hackaround迄今已调用performSelector: withObject: afterDelay:
在我结束shouldStartLoadWithRequest
的方法,但我不开心与此有关。
有谁知道我怎样才能正确地解决这个问题? 任何有识之士的赞赏!
你可以尝试使用NSURLConnectionDataDelegate
,它可以让你来处理输入数据。 也许你可以决定是否在页面中加入一个标志,以你的HTML文件手动加载。
NSURLConnectionDataDelegate参考
编辑: gist.github.com/buranmert/7304047我写了一段代码,它的工作,这可能不是你想要它的工作,但也许它可以帮助的方式。 每当用户点击URL的锚,它创建另一个连接和连接完成加载Web视图加载数据,这标志着在那里Web视图完成的页面加载点。 由于只使用本地HTML文件,我不认为创建连接会出现问题
你所描述的预期行为。 正如AJAX或资源请求永远不会传递给委托,只有根页的改变都不会打webViewDidFinishLoad:
但我有个好消息,它不涉及节省了很多钱在汽车保险。
iFrame中进行负载DO触发全面委托方法,这为您提供了一个解决方案。 您可以使用此机制的通知张贴到本机代码,就像通常所做console.log()
描述在这个岗位 。 另外, 本地桥将工作做好调入从JavaScript您的目标C代码。
只是检查的天气你长了委托函数DidStartLoading如果它被称为毫无疑问,DidFinish也应该被调用
你确定你的shouldStartLoadWithRequest总是返回YES ???
我总是添加
return YES;
在shouldStartLoadWithRequest implementation.And的,对我的工作结束。 通过YES返回,它表示该网页流量已经加载并会召唤webViewDidFinishLoad
if([webView isLoading]==1)
{
//your webview is loading
}
else
{
//your webview has loaded
}
下面是梅特暴风雪的代码迅速执行柜面有人正在寻找它。 (虽然NSURLConnection的被弃用的iOS 9)
但它并没有解决我的问题。 当我是弹出式菜单的视频jQuery的点击,它不火的webViewDidFinishLoad。
class WebViewController: UIViewController, UIWebViewDelegate, NSURLConnectionDelegate {
var menuURL: String?
var response: NSURLResponse?
var data = NSData()
// MARK: Properties
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
// From Web
let url = NSURL (string: menuURL!)
let urlRequest = NSURLRequest(URL: url!)
let connection = NSURLConnection(request: urlRequest, delegate: self)
self.data = NSData()
connection!.start()
// if this is false, page will be 'zoomed in' to normal size
webView.scalesPageToFit = false
}
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == .LinkClicked && request.URL!.fragment != nil {
let connection = NSURLConnection(request: request, delegate: self)
connection!.start()
return false
}
return true
}
func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {
self.response = response
}
func connection(connection: NSURLConnection, didReceiveData data: NSData) {
let oldData = NSMutableData(data: self.data)
oldData.appendData(data)
self.data = oldData
}
func connectionDidFinishLoading(connection: NSURLConnection) {
self.webView.loadData(self.data, MIMEType: self.response!.MIMEType!, textEncodingName: "utf-8", baseURL: self.response!.URL!)
self.data = NSData()
}
}
文章来源: UIWebViewDelegate: webViewDidFinishLoad not called during in-page navigation