iOS WKWebView javascript警报崩溃在ipad上

时间:2017-03-13 20:37:49

标签: javascript ios ipad wkwebview

我正在使用this answer中正确显示javascript alert / confirm / etc框的解决方案,它在iphone上运行良好。

<h2>{{.title}}</h2>
<h3>Page 1</h3>

然而,在ipads上点击任何带有javascript操作的内容会使应用程序崩溃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) }

  

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

我有点不知所措来解决这个问题。谁能就此给出一些建议?我尝试了各种使用方式

  

UIPopoverPresentationControllerDelegate方法   -prepareForPopoverPresentation'。

在我的代码中,但没有成功。任何建议对此表示赞赏。感谢。

1 个答案:

答案 0 :(得分:3)

想出这一个 - 想为其他任何人留下一张便条。对函数结束的一个小改动:

替换

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

    if let presenter = alertController.popoverPresentationController {
        presenter.sourceView = self.view
    }

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