2016-07-22 13 views
1

Im eine App zu entwickeln, das einige Inhaltsseiten aus unserem CMS hat die in ein WebView angezeigt muss, da sie darin HTML mit einigen Hyperlinks habenXamarin Forms Griff Hyperlinks in Webview Navigating Ausgabe

Im den Hyperlinks Weicht Steuerung wie erwartet funktioniert auf android im dies mit dem zu tun Navigating des Xamarin.Forms.WebView Ereignisses

im der Lage e.Url zu verwenden, um den Benutzer zu einer internen Seite zu senden.

Beispiel:

public class HybridWebView : WebView 
{ 
    public String Code { get; set; } 

    public HybridWebView() 
    { 
     Navigating += HybridWebView_Navigating; 
    } 


    private void HybridWebView_Navigating(object sender, WebNavigatingEventArgs e) 
    { 
     if(e.Url.EndsWith(".aspx") 
     { 
      var CMS = new CMSView(e.Code, null); 
      Navigation.PushAsync(CMS); 
      e.Cancel = true; 
     } 
    } 
} 

Hinweis dies gut funktioniert!

Das Problem ist:

wenn ich versuche, dies auf iOS bekam ich ein leeres/weiß WebView. Ich habe versucht, einen CustomRenderer auf iOS zu machen, aber da ich die WebView ableiten kann, um sie anzupassen, kann ich zum Beispiel die Eigenschaften Code nicht erreichen.

Wie erreiche ich die Eigenschaften im benutzerdefinierten Renderer für ios? Ich weiß e.NewElement, aber ShouldStartLoad erwartet UIWebView und nicht meine benutzerdefinierte HybridWebView.

Hat jemand irgendwelche Tipps oder Ideen, wie ich das erreichen kann.

Vielen Dank im Voraus

Antwort

3

In Ihrem Kunden-Renderer (eine Unterklasse von WebViewRenderer Ich gehe davon aus) Sie e.newElement auf Ihre HybridWebView Typ umwandeln kann, zB:

HybridWebView wv = e.NewElement as HybridWebView; 

Dann sollten Sie zugreifen können, Ihre Code Eigenschaft mit wv.Code.

Auch die NativeView Eigenschaft der WebViewRenderer gibt Ihnen die iOS native UIView mit zu arbeiten. Sie sollten in der Lage sein, dies ohne Probleme auf ein UIWebView zu übertragen. Zum Beispiel:

UIWebView nativeUIWebView = NativeView as UIWebView; 

Ich hoffe, das hilft!

+0

Thnx jgoldberger Ich brauche nicht e.NewElement zu casten, da es seinen Typ von hybridview kennt, aber wie kann ich ShouldStartLoad verwenden, erwartet es UIWebView als param und ich muss dort Hybridview verwenden. –

+0

Wenn ich etwas nicht vermisse, sollte das NativeView, das ich erwähnt habe, das sein, was der Basis-Renderer für Ihr HybridWebView erstellt hat. Also sollte dies die UIWebView sein, um mit ShuldStartLoad zu verwenden, es sei denn, ich missverstände? – jgoldberger

1

Wenn Sie ShouldStartLoad verwenden möchten, müssen Sie eine benutzerdefinierte UIWebViewDelegate für die native UIWebView implementieren, die verwendet wird. Dies kann schwierig werden, da Sie, wenn Sie den vorhandenen Delegaten durch einen benutzerdefinierten ersetzen, einige der integrierten Funktionen verlieren, die Xamarin.Forms WebView bietet. Hier ist die Strategie, die ich nutzen das Beste von beiden zu erhalten:

[assembly: ExportRenderer (typeof (WebView), typeof (CustomWebViewRenderer))] 
public class CustomWebViewRenderer : WebViewRenderer 
{ 
    protected override void OnElementChanged (VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged (e); 

     if (e.OldElement == null) { 

      // Need to capture the existing one so we don't loose functionality 
      // that Xamarin.Forms already has 
      var existingDelegate = Delegate; 

      // Make sure to pass the existing one to the new one 
      Delegate = new MyCustomWebViewDelegate(existingDelegate); 
     } 
    } 
} 

public class MyCustomWebViewDelegate : UIWebViewDelegate 
{ 
    readonly UIWebViewDelegate existingDelegate; 

    public MyCustomWebViewDelegate(UIWebViewDelegate existing) 
    { 
     existingDelegate = existing; 
    } 

    public override bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) 
    { 
     // You can customize this instead of returning the existingDelegate method 
     return existingDelegate.ShouldStartLoad(webView, request, navigationType); 
    } 

    public override void LoadFailed (UIWebView webView, NSError error) 
    { 
     existingDelegate.LoadFailed(webView, error); 
    } 


    public override void LoadingFinished (UIWebView webView) 
    { 
     existingDelegate.LoadingFinished(webView); 
    } 


    public override void LoadStarted (UIWebView webView) 
    { 
     existingDelegate.LoadStarted(webView); 
    } 

} 

Hinweis * Auf iOS, WebViewRenderer erbt direkt von UIWebView, so dass Sie nicht eine Eigenschaft Control Arbeit mit haben. Sie sind eine direkte Unterklasse von UIWebView und haben Zugriff auf die Eigenschaften, die Sie erwarten würden. Siehe Quelle here.

Sie können der MyCustomWebViewDelegate.ShouldStartLoad Methode eine benutzerdefinierte Anmeldung hinzufügen.