2016-05-04 12 views
1

私はWKWebViewにJavaScriptアラートを表示したいと思います。私はIWKUIDelegateとそのメソッドRunJavaScriptAlertPanel、RunJavaScriptConfirmPanelを実装しました。 JavaScriptアラートが呼び出されます。私はこれらのボタンの操作方法を知りたいと思います。Xamarin iOS WKWebView JavaScript Alertを表示

すべてのJavaScriptアラート用の汎用UIAlertViewを作成する方法はありますか。たとえば、私はerrorAlert.AddButton( "OK")を追加しました。実際には私はボタンとボタンのタイトルの数を知らない。またcompletionHandlerアクション

[Export ("webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:")] 
    public void RunJavaScriptConfirmPanel (WKWebView webView, String message, WKFrameInfo frame, Action<bool> completionHandler) 
    { 
     Console.WriteLine ("RunJavaScriptConfirmPanel"); 


     UIAlertView errorAlert = new UIAlertView(); 
     errorAlert.Title = "Alert"; 
     errorAlert.Message = message; 
     errorAlert.AddButton("OK"); 
     errorAlert.Show(); 
    } 

答えて

1

を処理する方法を私はそれをJavaScriptでまたはアプリでのC#であるかどうか、あなたがアクションを処理しようとしている場所がわからないので、私は両方に対処しようとするでしょう。短い答えは、javascriptで処理させ、必要に応じてダイアログから選択した後にjavascriptからアプリケーションにコールバックすることです。

アラート例

public override void RunJavaScriptAlertPanel(WKWebView webView, string message, WKFrameInfo frame, Action completionHandler) 
    { 
     var alert = UIAlertController.Create("Alert", message, UIAlertControllerStyle.Alert); 
     alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null)); 

     //Let javascript handle the OK click by passing the completionHandler to the controller 
     ViewController.PresentViewController(alert, true, completionHandler); 
    } 

だから

public override void RunJavaScriptTextInputPanel(WKWebView webView, string prompt, string defaultText, WKFrameInfo frame, Action<string> completionHandler) 
    { 
     var alert = UIAlertController.Create("Prompt", prompt, UIAlertControllerStyle.Alert); 
     alert.AddTextField(textfield => { textfield.Placeholder = defaultText; }); 
     alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, action => completionHandler(alert.TextFields[0].Text))); 
     alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, action => completionHandler(null))); 
     ViewController.PresentViewController(alert, true, null); 
    } 

public override void RunJavaScriptConfirmPanel(WKWebView webView, string message, WKFrameInfo frame, Action<bool> completionHandler) 
    { 
     var alert = UIAlertController.Create("Please confirm", message, UIAlertControllerStyle.Alert); 

     //Let javascript handle the OK click by passing the completionHandler to the controller 
     alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, action => completionHandler(true))); 
     //Let javascript handle the Cancel click by passing the completionHandler to the controller 
     alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, action => completionHandler(false))); 

     ViewController.PresentViewController(alert, true, null); 
    } 

プロンプトの確認例ボタンのクリックをjavascriptに戻す方法の例を示します。 JavaScriptをコールバックにしたい場合は、WKScriptMessageHandlerからサブクラス化してスクリプトハンドラを登録する必要があります。ここには基本的な例がありますhttps://forums.xamarin.com/discussion/41777/wkwebview-caching-not-working

ちょうどメモとしてUIAlertViewは推奨されていません。あなたは代わりにUIAlertControllerを使い始めたいと思うかもしれません。 https://stackoverflow.com/a/32690371/5606840を参照してください。 View Controllerにアクセスしてアラートを表示する場合は、初期化時にWKUIDelegateクラスに渡します。

編集

のWebViewのJavaScriptのスレッドを一時停止し、RunJavaScriptAlertPanelを呼び出します

alert('This is an alert'); 

JavaScriptで結果を処理する方法に展開します。 OKボタンがクリックされると、webview内のcompletionHandlerがコールバックされ、残りのjavascriptコードが実行されます。 Javascriptを確認方法渡って来るとき

if (confirm('Do you want to confirm this?')) { 
    //Do some code here when the user clicks ok 
} else { 
    //Do other code here when the user clicks cancel 
} 

アラートの例のように、それはRunJavaScriptConfirmPanelを呼び出します。 OKとCancelボタンとともに、メッセージを通したテキストを含むダイアログを表示することができます。クリックされたボタンに応じて、メソッドはtrueまたはfalseをWebviewにプッシュし、残りのJavaScriptコードを補完ハンドラを介して実行できるようにします。

+0

WKWebViewの問題点は、JavaScriptアラートが直接表示されないことです。上記のメソッドを追加して、アプリケーションにアラートを表示する必要があります。あなたが何を意味するかわからない短い答えは、javascriptでそれを処理させてください – User382

+0

また、私は各アラートが持つボタンの数とボタンのタイトルがわかりません。だから私は上記のようにハードコードすることはできません。どういうわけか、これらの機能やJavaScriptからその情報を取得する必要があります – User382

+1

アラートにはボタンが1つしかありません。確認にはボタンがあります(okとキャンセル)。プロンプトには2つのボタンとテキストボックスしかありません。上記の例は、ネイティブUIコントロールを使用してブラウザに表示されるように、ダイアログを再作成します。ユーザがボタンの1つをクリックすると、適切な応答がWebビューのハンドラに戻されます。 –

関連する問題