iOS的WKWebView JavaScript警报崩溃的iPad

我在这个答案中使用的解决scheme,正确地显示javascript alert / confirm / etc框,它在iphones上效果很好。

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in completionHandler() })) present(alertController, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in completionHandler(true) })) alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in completionHandler(false) })) present(alertController, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet) alertController.addTextField { (textField) in textField.text = defaultText } alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in if let text = alertController.textFields?.first?.text { completionHandler(text) } else { completionHandler(defaultText) } })) alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in completionHandler(nil) })) present(alertController, animated: true, completion: nil) } 

然而,在iPad上点击任何与JavaScript操作崩溃的应用程序与[UIPopoverPresentationController presentationTransitionWillBegin]

致命exception:NSGenericException您的应用程序已呈现样式为UIAlertControllerStyleActionSheet的UIAlertController()。 具有此样式的UIAlertController的modalPresentationStyle是UIModalPresentationPopover。 您必须通过警报控制器的popoverPresentationController为此popup窗口提供位置信息。 您必须提供sourceView和sourceRect或barButtonItem。 如果在显示警报控制器时不知道此信息,则可以在UIPopoverPresentationControllerDelegate方法-prepareForPopoverPresentation中提供此信息。

我有点在这里解决这个问题。 任何人都可以提供一些build议吗? 我已经尝试了各种使用方法

UIPopoverPresentationControllerDelegate方法“-prepareForPopoverPresentation”。

在我的代码中,但没有成功。 任何build议赞赏这一点。 谢谢。

想到这一个 – 想留下任何其他人跑到这个笔记。 function的一个小小的改变:

更换

  present(alertController, animated: true, completion: nil) 

  if let presenter = alertController.popoverPresentationController { presenter.sourceView = self.view } self.present(alertController, animated: true, completion: nil)