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

时间:2016-03-21 18:44:04

标签: ios uialertcontroller wkwebview

在崩溃报告中,我看到NSInternalInconsistencyExceptionWKWebView委托方法中抛出提示JavaScript警报,即。 "完成处理程序传递给 - [MyClass webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]未被调用"。

每个UIAlertAction从其处理程序调用{​​{1}}完成处理程序。唯一的解释是在不调用任何操作的情况下取消警报。 WKWebView为此类案件设置了委托方法,但UIAlertView未提供此级别的控制权。

有没有人为此设计过解决方案?

我考虑使用Apple在UIAlertController(在WebKit中)使用的相同技术来捕获我自己的回调失败,并调用WKWebView的处理程序来防止虚假的例外。看起来非常糟糕,我还不确定它会起作用。我宁愿首先防止这种情况发生。

编辑:我知道以编程方式解除警报控制器会产生这种行为,这很不幸,但我不知道iOS决定在没有用户交互的情况下解除控制器的情况。

编辑2:对于那些请求代码的人来说,这实际上是最低限度的实现:

CompletionHandlerCallChecker

1 个答案:

答案 0 :(得分:0)

这是我的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),从而避免异常。