我有一个应用程序,用户可以在其中导航一堆本地存储的 HTML 文件。我有一个UIWebView
,使用UIWebViewDelegate
正确配置。通常,当用户关注链接时,会调用shouldStartLoadWithRequest
,稍后会调用webViewDidFinishLoad
。
但是,如果链接指向与当前显示的锚点相同的页面上的锚点,则仅调用shouldStartLoadWithRequest
。 webViewDidFinishLoad
不会开火。
从某种意义上说,我发现这可能是预期的行为,因为页内导航不应该要求页面重新加载。但是,在页面导航完成后,我真的需要一个可以挂钩到调用堆栈的地方。当任何类型的导航结束时,最佳解决方案将让我知道,无论是从另一页,页内和向前/向后操作。
到目前为止,我最好的解决方法是在performSelector: withObject: afterDelay:
方法结束时致电shouldStartLoadWithRequest
,但我对此并不满意。
有谁知道我怎么能正确解决这个问题?有任何见解赞赏!
答案 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()
}
}