UIWebViewDelegate:在页面导航期间webViewDidFinishLoad不叫(UI

2019-08-18 01:47发布

我有一个应用程序,用户可以浏览一堆的本地存储的HTML文件。 我有一个UIWebView ,具有配置正确UIWebViewDelegate 。 通常情况下,当用户打开一个链接时, shouldStartLoadWithRequest叫,随后webViewDidFinishLoad晚了一点。

但是,如果该链接指向同一个页面作为当前显示的一个一个锚,只有shouldStartLoadWithRequest被调用。 webViewDidFinishLoad不火。

从某种意义上说,我看,这可能是预期的行为,因为在页面导航应该不需要重新加载页面。 可是,我真的需要一个地方挂接到调用堆栈后,页面导航是完整的。 最佳的解决方案将让我知道什么时候任何种类的导航已经结束,无论是从另一个网页,网页内和前进/后退操作。

我最好的hackaround迄今已调用performSelector: withObject: afterDelay:在我结束shouldStartLoadWithRequest的方法,但我不开心与此有关。

有谁知道我怎样才能正确地解决这个问题? 任何有识之士的赞赏!

Answer 1:

你可以尝试使用NSURLConnectionDataDelegate ,它可以让你来处理输入数据。 也许你可以决定是否在页面中加入一个标志,以你的HTML文件手动加载。

NSURLConnectionDataDelegate参考

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



Answer 2:

你所描述的预期行为。 正如AJAX或资源请求永远不会传递给委托,只有根页的改变都不会打webViewDidFinishLoad: 但我有个好消息,它不涉及节省了很多钱在汽车保险。

iFrame中进行负载DO触发全面委托方法,这为您提供了一个解决方案。 您可以使用此机制的通知张贴到本机代码,就像通常所做console.log()描述在这个岗位 。 另外, 本地桥将工作做好调入从JavaScript您的目标C代码。



Answer 3:

只是检查的天气你长了委托函数DidStartLoading如果它被称为毫无疑问,DidFinish也应该被调用



Answer 4:

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

我总是添加

return YES;

shouldStartLoadWithRequest implementation.And的,对我的工作结束。 通过YES返回,它表示该网页流量已经加载并会召唤webViewDidFinishLoad



Answer 5:

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


Answer 6:

下面是梅特暴风雪的代码迅速执行柜面有人正在寻找它。 (虽然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