UIWebViewDelegate:在页面内导航期间未调用webViewDidFinishLoad

时间:2013-03-27 08:27:47

标签: ios objective-c uiwebview navigation uiwebviewdelegate

我有一个应用程序,用户可以在其中导航一堆本地存储的 HTML 文件。我有一个UIWebView,使用UIWebViewDelegate正确配置。通常,当用户关注链接时,会调用shouldStartLoadWithRequest,稍后会调用webViewDidFinishLoad

但是,如果链接指向与当前显示的锚点相同的页面上的锚点,则仅调用shouldStartLoadWithRequestwebViewDidFinishLoad不会开火。

从某种意义上说,我发现这可能是预期的行为,因为页内导航不应该要求页面重新加载。但是,在页面导航完成后,我真的需要一个可以挂钩到调用堆栈的地方。当任何类型的导航结束时,最佳解决方案将让我知道,无论是从另一页,页内和向前/向后操作。

到目前为止,我最好的解决方法是在performSelector: withObject: afterDelay:方法结束时致电shouldStartLoadWithRequest,但我对此并不满意。

有谁知道我怎么能正确解决这个问题?有任何见解赞赏!

6 个答案:

答案 0 :(得分:8)

您可以尝试使用NSURLConnectionDataDelegate,它可以让您处理传入的数据。也许您可以通过在html文件中添加一个符号来确定是否手动加载页面。

NSURLConnectionDataDelegate Reference

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

答案 1 :(得分:6)

您所描述的是预期的行为。正如AJAX或资源请求永远不会传递给委托一样,只有根页面更改才会达到webViewDidFinishLoad:。但是我有好消息,并没有把一大笔钱存入汽车保险。

在iFrame DO 中执行的加载会触发完整的委托方法,这为您提供了解决方案。您可以使用此机制向本机代码发布通知,就像console.log()所描述的那样in this post。或者,Native Bridge可以很好地从JavaScript调用您的Objective C代码。

答案 2 :(得分:2)

只是查看天气你获得代理功能 DidStartLoading 如果被调用,毫无疑问 DidFinish 也应该被调用

答案 3 :(得分:1)

您确定 shouldStartLoadWithRequest 始终返回YES ???

我总是添加

return YES;

shouldStartLoadWithRequest 实现结束时。这对我有用。 返回YES,表示webview已加载并将调用 webViewDidFinishLoad

答案 4 :(得分:1)

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

答案 5 :(得分:0)

这是一个Swift实现Mert Buran的代码,任何人都在寻找它。 (虽然从iOS 9开始不推荐使用NSURLConnection)

但它并没有解决我的问题。当我点击弹出视频的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()
}


}