【发布时间】:2016-03-21 18:44:04
【问题描述】:
在崩溃报告中,我看到 NSInternalInconsistencyException 被 WKWebView 委托方法抛出以提示 JavaScript 警报,即。 “传递给 -[MyClass webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:] 的完成处理程序未被调用”。
每个UIAlertAction 从其处理程序调用WKWebView 完成处理程序。唯一的解释是警报在没有调用任何操作的情况下被取消。 UIAlertView 具有此类情况的委托方法,但 UIAlertController 不提供这种级别的控制。
有没有人为此设计过解决方案?
我考虑过使用 Apple 在 CompletionHandlerCallChecker(在 WebKit 中)中使用的相同技术来捕获我自己的回调未能被调用,并调用 WKWebView 的处理程序来防止虚假异常。看起来非常笨拙,我还不确定它会起作用。我宁愿从一开始就阻止这种情况发生。
编辑:我知道以编程方式关闭警报控制器会产生这种行为,这是不幸的,但我不知道 iOS 决定在没有用户交互的情况下关闭控制器的情况。
编辑2:对于那些请求代码的人来说,这确实是最低限度的实现:
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
completionHandler();
}]];
[self presentViewController:alertController animated:YES completion:nil];
}
【问题讨论】:
-
在您的问题中发布相关代码。
-
你有一个用于取消按钮的 UIAlertAction 吗?
-
您找到解决方案了吗?如果没有,您将如何处理您提到的 CompletionHandlerCallChecker?我有完全相同的问题,可能会出现其他一些 UI 并导致警报被解除,而不是被告知只会导致此异常。
标签: ios uialertcontroller wkwebview