当前位置:  开发笔记 > 编程语言 > 正文

UIWebView shouldStartLoadWithRequest只调用一次?

如何解决《UIWebViewshouldStartLoadWithRequest只调用一次?》经验,为你挑选了2个好方法。

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

jump to footnote

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

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

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

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

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



1> GrafikRobot..:

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


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

2> Ben Dolman..:

我可以通过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;
    }
}

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有