11

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

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

从某种意义上说,我认为这可能是预期的行为,因为页面内导航不应该需要重新加载页面。但是,页面内导航完成后,我真的需要一个地方来挂钩调用堆栈。最佳解决方案会在任何类型的导航结束时通知我,无论是从另一个页面、页内还是前进/后退操作。

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

有谁知道我该如何正确解决这个问题?任何见解表示赞赏!

4

6 回答 6

8

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

NSURLConnectionDataDelegate 参考

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

于 2013-11-04T09:39:44.630 回答
6

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

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

于 2013-11-07T16:28:24.490 回答
2

只需检查天气你得到了委托函数DidStartLoading如果它被调用,毫无疑问DidFinish也应该被调用

于 2013-11-11T04:08:06.320 回答
1
if([webView isLoading]==1)
{
    //your webview is loading
}
else
{
   //your webview has loaded
}
于 2013-11-09T14:05:18.580 回答
1

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

我总是加

return YES;

shouldStartLoadWithRequest实施结束时。这对我有用。通过返回 YES,它表示 webview 已经加载并会调用 webViewDidFinishLoad

于 2013-11-05T08:32:16.193 回答
0

这是 Mert Buran 代码的 Swift 实现,以防有人在寻找它。(虽然 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()
}


}
于 2016-08-24T12:58:15.737 回答