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

tho*_*max 11 navigation objective-c uiwebview ios uiwebviewdelegate

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

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

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

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

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

Mer*_*ran 8

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

NSURLConnectionDataDelegate参考

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


Hol*_*lly 6

你所描述的是预期的行为.正如AJAX或资源请求永远不会传递给委托一样,只会发生根页面更改webViewDidFinishLoad:.但我有好消息,并不涉及在汽车保险上节省一大笔钱.

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