UIWebView第二次卡住了

Posted

技术标签:

【中文标题】UIWebView第二次卡住了【英文标题】:UIWebView stuck at the second time 【发布时间】:2015-04-22 22:35:44 【问题描述】:

我正在开发一个 ios 应用程序,用户可以从收件箱列表中选择一封电子邮件,并在下一页上查看它(有一个 UIWebView 来提供内容)。

这是我观察到的:我第一次选择电子邮件时,它很快就显示在第二页上。但是,如果我返回并选择再次查看电子邮件,则需要很长时间才能在第二页上调用 webViewDidFinishLoad:

我在控制台中看到以下消息:

void SendDelegateMessage(NSInvocation *): 
delegate (webView:didFinishLoadForFrame:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode

此消息一打印,内容就会在 WebView 上呈现。

我不明白的是,这总是发生在第二次使用 webview 显示 html 内容时。没有文件/资源​​的本地缓存,也没有网络问题。

请指出我应该在哪里查看此问题。谢谢!

---- 更新----

在我的随机尝试中,我发现删除了这一行:

self.webView.delegate = self;

将使问题消失。这让我感到更加困惑。为什么让 self 成为代表会导致这样的问题?

---- 更新 2 ----

我发现罪魁祸首是我在 webview 加载 html 后调用的扁平化 html 方法。 如果我删除 NSHTMLTextDocumentType 一切都很好,但我不明白为什么:

+ (NSString *) stripHtmlSchema: (NSString *)htmlString

    NSString *flatString = [[[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding]
                                                            options:@ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                      NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]
                                                 documentAttributes:nil
                                                              error:nil] string];
    return flatString;

----最终更新----

解决了这个问题。 [NSAttributedString alloc] initWithData 执行时间过长,因此阻止了所有内容。

【问题讨论】:

你在 webview 中使用了任何 javascript 代码吗?文档声明“每个***入口点的 JavaScript 执行时间限制为 10 秒。如果您的脚本执行时间超过 10 秒,则 Web 视图将停止执行脚本” @MathiasKogler 感谢您的回复。没有javascript执行。而且我第一次不明白它是如何工作的。 【参考方案1】:

解决了这个问题。 [NSAttributedString alloc] initWithData 执行时间过长,因此阻止了所有内容。

【讨论】:

以上是关于UIWebView第二次卡住了的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView loadRequest 重用给出闪烁效果

将 UIWebView 添加到第二个(不是第一个)故事板视图控制器

SWIFT 无法使用第二个按钮在 UIWebView 中打开第二个 URL

UIWebView 段落选择样式

模式视图中的 UIWebview 在横向模式下以纵向显示

UIPageControl 更改 UIWebView 的 URL