ios – 什么可以导致永远不会调用UIAlertController操作?

前端之家收集整理的这篇文章主要介绍了ios – 什么可以导致永远不会调用UIAlertController操作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在崩溃报告中,我看到从WKWebView委托方法抛出NSInternalInconsistencyException以提示 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];
}

解决方法

这是我的kludgy但工作解决方案:

class CompletionHandlerCallCheckerDefeater: NSObject {
  private var calledCompletionHandler: Bool = false
  private var fallbackHandler: () -> Void

  init(fallbackHandler: () -> Void) {
    self.fallbackHandler = fallbackHandler
  }

  deinit {
    if (!calledCompletionHandler) {
      fallbackHandler()
    }
  }

  func didCallCompletionHandler() {
    calledCompletionHandler = true
  }
}

在您的委托回调中,使用它如下:

let defeater = CompletionHandlerCallCheckerDefeater(fallbackHandler: completionHandler)
let alertController = UIAlertController(title: title,message: message,preferredStyle: .Alert)
alertController.addAction(UIAlertAction(title:"OK",style: .Default) { (action) in
    completionHandler()
    defeater.didCallCompletionHandler()
})
presentViewController(alertController,animated: true,completion:  nil)

为fallbackHandler分配必要的东西,它不必是传入的块,它只需要用适当的参数调用completionHandler.释放所有引用时都会销毁“失败者”,即当警报被销毁时,如果从未调用didCallCompletionHandler,它将调用fallbackHandler(调用completionHandler),从而避免异常.

猜你在找的iOS相关文章