2016-04-05 15 views
1

私はXamarinとiOSを初めて使いました。私はWkWebViewをレンダリングするXamarin Formsでカスタムレンダラーを作成しようとしています。ユーザーがWebview内のリンクをタップしたときに、私のメソッドを呼びたいのですが、それは起こっていません。理由はわかりません。私は参照としてXlabのHybridViewRenderを使用しようとしています。誰かが私がWkWebViewにDidStartProvisionalNavigation()に電話をかける方法を教えてもらえますか?ありがとうWkWebViewのナビゲートイベントを聞く

私のカスタムIOSレンダラのソースコードは、WkWebViewを使っています。

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, WKWebView>, IWKScriptMessageHandler 
    { 
     const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}"; 
     WKUserContentController userController; 

     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      base.OnElementPropertyChanged(sender, e); 

      if (e.PropertyName == "Uri") 
       Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri))); 
     } 

     protected override void OnElementChanged (ElementChangedEventArgs<HybridWebView> e) 
     { 
      base.OnElementChanged (e); 

      if (Control == null) { 
       userController = new WKUserContentController(); 
       var script = new WKUserScript (new NSString (JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false); 
       userController.AddUserScript (script); 
       userController.AddScriptMessageHandler (this, "invokeAction"); 
       var config = new WKWebViewConfiguration { UserContentController = userController }; 
       config.ApplicationNameForUserAgent += " MethodApp"; 
       var webView = new WKWebView (Frame, config); 

       SetNativeControl (webView); 
      } 
      if (e.OldElement != null) { 
       userController.RemoveAllUserScripts(); 
       userController.RemoveScriptMessageHandler ("invokeAction"); 
       var hybridWebView = e.OldElement as HybridWebView; 
       e.OldElement.onRefresh -= Refresh; 
       hybridWebView.Cleanup(); 
      } 
      if (e.NewElement != null) { 
       e.NewElement.onRefresh += Refresh; 
       //string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", Element.Uri)); 
       if (Element.Uri != null) 
        Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri))); 

      } 
     } 

     public void Refresh(object sender, EventArgs ea) { 
      Control.Reload(); 
     } 

     public void DidReceiveScriptMessage (WKUserContentController userContentController, WKScriptMessage message) 
     { 
      Element.InvokeAction (message.Body.ToString()); 
     } 

     [Export("webView:didStartProvisionalNavigation:")] 
     public void DidStartProvisionalNavigation(WKWebView webView, WKNavigation navigation) 
     { 
      Element.OnNavigating(webView.Url); 
     } 
    } 

答えて

2

DidStartProvisionalNavigation方法はIWKNavigationDelegateWKWebViewに含まれているあなたが必要とする必要があるすべてはあなたの中にあなたのWebViewにNavigationDelegateとして設定されているカスタムの委任

public class MyNavigationDelegate : WKNavigationDelegate 
{ 
    private readonly HybridWebViewRenderer _renderer; 

    public MyNavigationDelegate(HybridWebViewRenderer renderer) 
    { 
     _renderer = renderer; 
    } 

    public override void DidFailProvisionalNavigation(WKWebView webView, WKNavigation navigation, NSError error) 
    { 
     // call methods of your renderer or its properties like 
     _renderer.Element.OnNavigating(webView.Url); 
    } 
} 

あるプロパティにNavigationDelegate

を持っていますレンダラー

var webView = new WKWebView (Frame, config); 
webView.NavigationDelegate = new MyNavigationDelegate(this); 
1

私は

public override void DidStartProvisionalNavigation(WKWebView webView, WKNavigation navigation) 

は、あなたがあなたのWebViewのNavigationDelegateプロパティに割り当てることを、WKNavigationDelegateを実装する委譲クラスであることが必要と考えています。

このフォーラムthreadは、私はあなたがWKWebViewためWeakNavigationDelegateを設定していることを確認していないWKWebView

2

:コードの後

webView.NavigationDelegate = this; 

を:

var webView = new WKWebView (Frame, config); 

もドン」変更するのを忘れないでください:

その後
public class HybridWebViewRenderer : ViewRenderer< HybridWebView,WKWebView>, IWKScriptMessageHandler, IWKNavigationDelegate 

、あなたはDidStartProvisionalNavigationコードを使用して上書きできます。

[Export("webView:didStartProvisionalNavigation:")] 
public void DidStartProvisionalNavigation(WKWebView webView,WKNavigation navigation) 
{ 
// When navigation starts, this gets called 
Console.WriteLine("DidStartProvisionalNavigation"); 
} 
関連する問題