2016-05-04 3 views
1

Я хотел бы показать оповещение JavaScript в своем WKWebView. Я внедрил IWKUIDelegate и его методы RunJavaScriptAlertPanel, RunJavaScriptConfirmPanel. Они вызваны для оповещения JavaScript. Я хотел бы знать, как обращаться с кнопками и действием на этих кнопках.Xamarin iOS WKWebView, отображающий оповещение JavaScript

Есть ли способ, которым я могу написать общий UIAlertView для всех предупреждений JavaScript. Например ниже я добавил errorAlert.AddButton («ОК»); но на самом деле я не знаю количества кнопок и названия кнопок. Кроме того, как обрабатывать действия 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 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); 
    } 

Подсказка Пример

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); 
    } 

Так что дает вам пример того, как передать кнопку мыши на javascript. Если вы хотите, чтобы javascript выполнял обратный вызов, вам нужно зарегистрировать обработчики сценариев путем подкласса от WKScriptMessageHandler. Здесь приведен базовый пример: https://forums.xamarin.com/discussion/41777/wkwebview-caching-not-working

Как примечание, UIAlertView устарел. Вместо этого вы можете начать использовать UIAlertController. См. https://stackoverflow.com/a/32690371/5606840. Если вы хотите получить доступ к контроллеру представления для отображения предупреждений, передайте его в свой класс WKUIDelegate при инициализации.

Редактировать

Расширять о том, как обрабатывать результаты в JavaScript

alert('This is an alert'); 

WebView приостановит яваскрипту нить и называет RunJavaScriptAlertPanel. Как только кнопка ОК нажата, она перезвонит завершениеHandler в webview, а остальная часть кода 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 
} 

Как предупредительного например, когда Javascript попадается метода подтверждающим, он будет вызывать RunJavaScriptConfirmPanel. Затем вы можете показать диалог с текстом, переданным через сообщение, вместе с кнопкой «ОК» и «Отмена». В зависимости от нажатой кнопки метод будет возвращать true или false обратно в веб-просмотр и разрешать выполнение остального кода javascript через обработчик завершения.

+0

Проблема с WKWebView заключается в том, что она не отображает JavaScript Alert напрямую. Мне нужно добавить выше методы, чтобы показать оповещение в приложении. Не уверен, что вы подразумеваете под ---- Короткий ответ: пусть javascript обрабатывает его – User382

+0

Также я не знаю, сколько кнопок у каждого оповещения есть и название кнопки. Поэтому я не могу жестко записать его, как показано выше.Как-то мне нужно получить эту информацию из этих функций или JavaScript. – User382

+1

У предупреждения будет только одна кнопка, у подтверждения есть кнопки (ok & cancel), а в приглашении также будут только две кнопки вместе с текстовым полем. Примеры, приведенные выше, в значительной степени воссоздают диалоговые окна, которые ожидали бы, что они появятся в браузере, используя собственные средства управления ui. Как только пользователь нажимает на одну из кнопок, соответствующий ответ затем будет передан обработчикам в webview. –

Смежные вопросы