UIWebView shouldStartLoadWithRequest只调用一次?

Ale*_*lex 16 html iphone uiwebview

在我的iPhone应用程序中,我有一个UIWebView,我正在加载一个本地的HTML.一切正常,但现在我想能够处理本地链接(到脚注):当我点击本地链接时,我希望能够跳到它所引用的脚注,然后能够回来.

<a href="#tofootnote">jump to footnote</a>
Run Code Online (Sandbox Code Playgroud)

我通过将我的代码添加到shouldStartLoadWithRequest并拦截本地链接点击来处理此问题; 当点击本地链接时,我会运用我的魔法(隐藏一些ui元素,添加后退按钮等等); 单击后退按钮会将我跳回到html文档中的原始位置.

问题是单击链接上的ONCE不再调用shouldStartLoadWithRequest.即,以下代码:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
 NSLog(@"foo bar");
 return YES;
}
Run Code Online (Sandbox Code Playgroud)

只显示"foo bar"ONCE(实际上,两次 - 我第一次加载文档时),但之后只有ONCE,无论我点击本地链接多少次

因此,除非有人有更好的解释,否则我猜测UIWebView会缓存doc或链接或其他内容,并且在初始调用后不再调用处理程序; 如果是这种情况,我该如何清除此内部缓存?(不重新加载文件)

Gra*_*bot 14

我发现这个问题的唯一解决方案是将所有锚点从"#anchor"字符串替换为一个被认为是URL的东西,比如"| anchor".这样UIWebView就会认为它是一个真正的链接,并在点击时尝试该请求.这个解决方案显然只有在您自己处理所有点击时才有效,因此可以解释更改后的锚点.我可以理解UIWebView行为的原因,但它相当令人沮丧.委托真的需要消息来匹配onclick等处理程序.

  • 原因很简单.从技术上讲,当前存在的UIWebView回调用于处理被点击的网页的"检索".当您单击哈希链接时,您没有检索页面,只能在当前页面中导航.因此从技术上讲,这不是一个错误.除非您认为错误的API设计是一个错误.我倾向于认为糟糕的设计是一个错误..但我承认苹果可能有不同的意见;-) (3认同)

Ben*_*man 6

我可以通过window.location在处理有效锚点后设置为虚拟锚点来解决此问题.

- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if ([[request URL] fragment]) {
        if ([[[request URL] fragment] isEqualToString:@"__DUMMY_ANCHOR"])
            return NO;

        // Do your custom handling of the anchor here

        // Change the location to a non-existent anchor
        [aWebView stringByEvaluatingJavaScriptFromString:@"window.location='#__DUMMY_ANCHOR'"];

        return NO;
    }
}
Run Code Online (Sandbox Code Playgroud)