質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4554閲覧

WKWebViewのJavascriptが出すアラート等に対応したい

apple2

総合スコア37

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/04/25 06:59

編集2017/04/26 23:33
コード ```WKWebViewに表示されたJavascriptのアラートなどを表示するものですが iOS版を参考にMacOSX版に書き換えたいと思ってググてみても、なかなか参考になるページが見つかりません みなさんに頼ってばかりで恐縮なのですが教えてください ```Swift3 import Cocoa import Foundation import WebKit class ViewController: NSViewController , WKNavigationDelegate , WKUIDelegate { @IBOutlet var myWeb: WKWebView! override func viewDidLoad() { super.viewDidLoad() myWeb.uiDelegate = self let url = NSURL(string: "http://www.tagindex.com/javascript/window/alert1.html") let req = NSURLRequest(url:url! as URL) myWeb.load(req as URLRequest!) } func webView(_ myWeb: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { print("display alert dialog") let alert = NSAlert() alert.messageText = message alert.addButton(withTitle: "OK") let res = alert.runModal() if res == NSAlertFirstButtonReturn { print("pushed") } } func webView(_ myWeb: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { print("display confirm dialog") } func webView(_ myWeb: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { print("display prompt dialog") } override var representedObject: Any? { didSet { // Update the view, if already loaded. } } }

こうしてみたんですけど、アラートを出してOKを押すとCrashします。
どうやったらJavascriptに結果を渡せるのか分かりません。ググるとiOS版はたくさん情報があるのですがMacOSX版は全然見つかりません

アラートに関しては下記のようにcompletionHandler()を追加することで、うまく動作するようになりました

Swift3

1 let alert = NSAlert() 2 alert.messageText = message 3 alert.addButton(withTitle: "OK") 4 let res = alert.runModal() 5 completionHandler()

後は、ダイアログの作成です
ダイアログもできました

Swift3

1 let alert = NSAlert() 2 alert.messageText = message 3 alert.addButton(withTitle: "OK") 4 alert.addButton(withTitle: "Cansel") 5 let res = alert.runModal() 6 if res == NSAlertFirstButtonReturn { 7 completionHandler(true) 8 }else{ 9 completionHandler(false) 10 }

後はインプットパネルです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました

import Cocoa
import Foundation
import WebKit

class ViewController: NSViewController , WKNavigationDelegate , WKUIDelegate {

@IBOutlet var myWeb: WKWebView! override func viewDidLoad() { super.viewDidLoad() myWeb.uiDelegate = self let url = NSURL(string: "http://www.tagindex.com/javascript/window/alert1.html") let req = NSURLRequest(url:url! as URL) myWeb.load(req as URLRequest!) } func webView(_ myWeb: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { print("display alert dialog") let alert = NSAlert() alert.messageText = message alert.addButton(withTitle: "OK") _ = alert.runModal() completionHandler() } func webView(_ myWeb: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { let alert = NSAlert() alert.messageText = message alert.addButton(withTitle: "OK") alert.addButton(withTitle: "Cancel") let res = alert.runModal() if res == NSAlertFirstButtonReturn { completionHandler(true) }else{ completionHandler(false) } } func webView(_ myWeb: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { let alert = NSAlert() alert.messageText = prompt alert.informativeText = defaultText! let textField = NSTextField(frame: NSRect(x:0,y: 0,width: 200,height: 24)) alert.accessoryView = textField alert.addButton(withTitle: "OK") alert.addButton(withTitle: "Cancel") print("before") let res = alert.runModal() if res == NSAlertFirstButtonReturn { print((alert.accessoryView as! NSTextField).stringValue) print("FirstButton") let str = (alert.accessoryView as! NSTextField).stringValue completionHandler(str) }else if res == NSAlertSecondButtonReturn{ print("SecondButton") completionHandler("") } } override var representedObject: Any? { didSet { // Update the view, if already loaded. } }

}

投稿2017/04/27 10:21

apple2

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問