Делегат устарел в iOS 12.0. Пожалуйста, примите WKWebView. Как я могу это исправить в Xamarin? - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать пользовательский рендерер WebView для iOS и Android.Моя главная цель - сделать так, чтобы WebView соответствовал содержимому HTML;

После поиска в Google, я скоро понял, что это возможно только путем создания пользовательских средств визуализации как для iOS, так и для Android.

Я использую решение, которое требует делегата.Вы можете посмотреть решение здесь .Тем не менее, это решение было опубликовано в 2016 году, и поэтому я получаю это сообщение об ошибке времени компиляции: «« Делегат »устарел в iOS 12.0. Больше не поддерживается; примите« WKWebView ».

PostWebView.xaml»

<WebView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Yoors.Views.Templates.PostWebView" x:Name="WebViewer" BackgroundColor="White" Margin="0, 10, 0, 0" VerticalOptions="FillAndExpand" HeightRequest="1000">
    <WebView.Source>
        <HtmlWebViewSource Html="{Binding Data.Content}" />
    </WebView.Source>
</WebView>

CustomWebViewRenderer.cs

 public class CustomWebViewRenderer : WebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            Delegate = new CustomUIWebViewDelegate(this);
        }

    }

CustomUIWebViewDelegate.cs

public class CustomUIWebViewDelegate : UIWebViewDelegate
    {


        CustomWebViewRenderer _webViewRenderer;

        public CustomUIWebViewDelegate(CustomWebViewRenderer webViewRenderer = null)
        {
            _webViewRenderer = _webViewRenderer ?? new CustomWebViewRenderer();
        }

        public override async void LoadingFinished(UIWebView webView)
        {
            var wv = _webViewRenderer.Element as PostWebView;
            if (wv != null)
            {
                await System.Threading.Tasks.Task.Delay(100); // wait here till content is rendered
                wv.HeightRequest = (double)webView.ScrollView.ContentSize.Height;
            }
        }
    }

Как сделатьЯ принимаю WKWebView в соответствии с моим кодом?

1 Ответ

1 голос
/ 24 мая 2019

На самом деле это довольно просто: создать собственное веб-представление примерно так:

public class MyWebView : WebView
{
  public static readonly BindableProperty UrlProperty = BindableProperty.Create(
    propertyName: "Url",
    returnType: typeof(string),
    declaringType: typeof(MyWebView),
    defaultValue: default(string));

 public string Url
 {
    get { return (string)GetValue(UrlProperty); }
    set { SetValue(UrlProperty, value); }
 }
}

Затем в вашем iOS CustomRenderer сделайте что-то вроде этого:

[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace WKWebView.iOS
{
public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
{
    WKWebView _wkWebView;
    protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var config = new WKWebViewConfiguration();
            _wkWebView = new WKWebView(Frame, config);
            SetNativeControl(_wkWebView);
        }
        if (e.NewElement != null)
        {
            Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
        }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...