2016-04-20 6 views
2

Ich implementiere WKWebView in iOS Xamarin und ich möchte etwas tun, wenn Start und Laden zu laden. Ich habe IWKNavigationDelegate implementiert und die folgenden Funktionen hinzugefügt, aber keiner von ihnen wird aufgerufen.Xamarin iOS WKWebView DidFinishNavigation und DidStartProvisionalNavigation wird nicht aufgerufen

Klassendefinition

public partial class MasterViewController : UIViewController,IScanSuccessCallback, IWKScriptMessageHandler, IWKNavigationDelegate 
{ } 

Navigation Delegate bin ich etwas fehlt funktioniert

public void DidFinishNavigation(WKWebView webView, WKNavigation navigation) 
    { 
     Console.WriteLine ("DidFinishNavigation"); 
    } 

    public void DidFailNavigation(WKWebView webView, WKNavigation navigation, NSError error) 
    { 
     // If navigation fails, this gets called 
     Console.WriteLine("DidFailNavigation"); 
    } 
    public void DidFailProvisionalNavigation(WKWebView webView, WKNavigation navigation, NSError error) 
    { 
     // If navigation fails, this gets called 
     Console.WriteLine("DidFailProvisionalNavigation"); 
    } 
    public void DidStartProvisionalNavigation(WKWebView webView, WKNavigation navigation) 
    { 
     // When navigation starts, this gets called 
     Console.WriteLine("DidStartProvisionalNavigation"); 
    } 
+0

Haben Sie Ihrer WKWebView-Instanz die Delegate-Klasse zugewiesen? – Jason

+0

Ich habe - IWKNavigationDelegate wie oben bearbeitet. Wie ordne ich WKWebView eine Delegiertenklasse zu? – User382

Antwort

7

Ergänzung Jason Antwort auf WebView.

Sie die erforderliche ExportAttribute für optionale Delegatmethoden fehlt, sollte Xamarin Studio Auto Completion-Engine diese jedes Mal für Sie erzeugen Sie eine IFooInterface implementieren, wenn Foo ein Delegierter ObjC ist und Sie geben override (es sollte optional Liste und nicht optional Mitglieder). ExportAttribute ist nur für optionale Mitglieder erforderlich (nicht abstrakte Mitglieder in der C# -Schnittstelle).

enter image description here

In diesem speziellen Fall alle Mitglieder WKNavigationDelegate ObjC Protokoll sind optional, so dass Sie das Export Attribut und den ObjC Selektor als Parameter benötigen.

Sie müssen using Foundation zu Ihren Verwendungsaussagen hinzufügen, ExportAttribute ist drin.

[Export ("webView:didFinishNavigation:")] 
public void DidFinishNavigation(WKWebView webView, WKNavigation navigation) 
{ 
    Console.WriteLine ("DidFinishNavigation"); 
} 

[Export ("webView:didFailNavigation:withError:") 
public void DidFailNavigation(WKWebView webView, WKNavigation navigation, NSError error) 
{ 
    // If navigation fails, this gets called 
    Console.WriteLine("DidFailNavigation"); 
} 

[Export ("webView:didFailProvisionalNavigation:withError:")] 
public void DidFailProvisionalNavigation(WKWebView webView, WKNavigation navigation, NSError error) 
{ 
    // If navigation fails, this gets called 
    Console.WriteLine("DidFailProvisionalNavigation"); 
} 

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

Hoffe, das hilft.

+0

genannt Ich denke, eine der Quellen der Verwirrung ist, dass manchmal delegieren Klassen sind, manchmal (wie hier) sind als Schnittstellen implementiert. Außerdem heißt es in der Dokumentation (bezüglich IWKNavigationDelegate): "Wenn Entwickler Klassen erstellen, die diese Schnittstelle implementieren, werden die Implementierungsmethoden automatisch nach Objective-C mit der passenden Signatur aus der im WKNavigationDelegate-Protokoll definierten Methode exportiert." In der Tat wird es als schwaches Delegate behandelt – markusian

1

Sie müssen die NavigationDelegate Klasse explizit zuweisen

WKWebView web = new WKWebView(); 

// if the current class implements IWKNavigationDelegate, you can do this 
web.NavigationDelegate = this; 

// or you can create a separate class that implements IWKNavigationDelegate 
web.NavigationDelegate = new MyWebDelegate(); 
+0

Ich habe getan // Wenn die aktuelle Klasse IWKNavigationDelegate implementiert, können Sie dies tun web.NavigationDelegate = this; Aber immer noch Methoden werden nicht – User382

Verwandte Themen