UIWebViewDelegate:webViewDidFinishLoad在页内导航期间不被调用

我有一个应用程序,用户可以浏览一堆本地存储的HTML文件。 我有一个UIWebView ,用UIWebViewDelegate正确configuration。 通常,当用户关注链接时, shouldStartLoadWithRequest被调用,随后webViewDidFinishLoad被稍后调用。

但是,如果链接指向与当前显示的页面相同的页面上的锚点,则只shouldStartLoadWithRequestwebViewDidFinishLoad不会触发。

从某种意义上说,我发现这可能是预期的行为,因为页面内导航不应该要求页面重新加载。 不过,在页内导航完成后,我确实需要一个地方来挂钩调用堆栈。 最佳的解决scheme会让我知道何时导航已经结束,无论是来自另一页,页内和前进/后退动作。

到目前为止,我最好的方法是调用performSelector: withObject: afterDelay:在我的shouldStartLoadWithRequest方法的结尾处​​,但是我对此并不满意。

有谁知道我能如何解决这个问题? 任何洞察赞赏!

你可以尝试使用NSURLConnectionDataDelegate ,它允许你处理传入的数据。 也许你可以通过给html文件添加一个符号来判断页面是否被手动加载。

NSURLConnectionDataDelegate参考

编辑: gist.github.com/buranmert/7304047我写了一段代码,它的工作,可能不是你想要的方式工作,但也许它有帮助。 每当用户点击一个带有锚点的URL时,就会创build另一个连接,当连接完成后,加载Web视图加载数据,这标志着Web视图完成加载页面的点。 由于您只使用本地html文件,我不认为创build连接会产生问题

你所描述的是预期的行为。 就像AJAX或资源请求永远不会传递给委托一样,只有根页面的更改才会webViewDidFinishLoad: 但是我有个好消息,并不需要在汽车保险上节省一大笔钱。

在iFrame DO中执行的加载会触发完整的委托方法,并为您提供解决scheme。 您可以使用此机制将通知发布到本地代码,就像本文中所述,就像通常为console.log()所做的一样。 或者, Native Bridge可以很好地从JavaScript调用Objective C代码。

只要检查天气你得到委托functionDidStartLoading如果它被称为毫无疑问DidFinish也应该被调用

你确定你的shouldStartLoadWithRequest总是返回一个YES?

我总是补充

 return YES; 

shouldStartLoadWithRequest实现的结尾,这对我很有用。 通过返回YES,它表示webview已经加载并将调用webViewDidFinishLoad

 if([webView isLoading]==1) { //your webview is loading } else { //your webview has loaded } 

这是一个Swrt的实现Mert Buran的代码incase任何人都在寻找它。 (尽pipeNSURLConnection自iOS 9起已弃用)

但是这并没有解决我的问题。 当我点击popup一个video的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() } }