Xamarin.forms xamarin表单:已引发System.ArgumentNullException(IOS)

Xamarin.forms xamarin表单:已引发System.ArgumentNullException(IOS),xamarin.forms,webview,argumentnullexception,Xamarin.forms,Webview,Argumentnullexception,我正在使用webview解析HTML数据。为此,我使用自定义渲染 在主项目中: public class MyWebView : WebView { public static readonly BindableProperty UrlProperty = BindableProperty.Create( propertyName: "Url", returnType: typeof(string), declaringType: typeof(MyWebVie

我正在使用webview解析HTML数据。为此,我使用自定义渲染

在主项目中:

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渲染器

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.LoadHtmlString(Element.Url, null);   //use this code instead
            //Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
        }
    }
}
公共类MyWebViewRenderer:ViewRenderer { WKWebView WKWebView; 受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e) { 基础。一个要素发生变化(e); if(Control==null) { var config=新的WKWebViewConfiguration(); _wkWebView=新的wkWebView(框架,配置); SetNativeControl(_wkWebView); } if(例如NewElement!=null) { Control.LoadHtmlString(Element.Url,null);//改用此代码 //LoadRequest(新的NSUrlRequest(新的NSUrl(Element.Url)); } } } 在XAML和XAML.cs中:

<local:MyWebView 
    x:Name="web_view"
    VerticalOptions="FillAndExpand"/>

web_view.Url = htmldata;

web_view.Url=htmldata;
但是我在运行项目时遇到了
System.ArgumentNullException

屏幕截图:

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

我认为LoadHtmlString方法是导致异常的原因,现在它说这是ArgumentNullException,即不应为null的参数为null,要解决WkWebView不应传递null的问题,只需传递NSBundle的MainBundle BaseUrl,如下所示:

  Control.LoadHtmlString(new NSString(Element?.Url), NSBundle.MainBundle.BundleUrl);
如果问题仍然存在,请确保在问题中添加StackTrace

祝你好运,如果有问题,请随时回来

更新


此外,如果您有XF 4.4及更高版本,则可以使用
WkWebViewRenderer
我认为LoadHtmlString方法是导致异常的原因,现在它说它是ArgumentNullException,即不应为null的参数为null,要解决WkWebView不应传递null的问题,只需传递NSBundle的MainBundle BaseUrl,如下所示:

  Control.LoadHtmlString(new NSString(Element?.Url), NSBundle.MainBundle.BundleUrl);
如果问题仍然存在,请确保在问题中添加StackTrace

祝你好运,如果有问题,请随时回来

更新

此外,如果您有XF 4.4及更高版本,则可以使用
WkWebViewRenderer
WebViewRenderer始终显示
Hello world
(如果未应用样式,则非常小):

/“WebViewRenderer”已过时:“WebViewRenderer从4.4.0开始已过时。请改用WkWebViewRenderer'
//WkWebViewRenderer继承自WKWebView
公共类MyWebViewRenderer:WkWebViewRenderer
{
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
var myWebView=(myWebView)e.NewElement;
如果(myWebView!=null)
{
...
}
WKWebView WKWebView=此;
var htmlString=“你好世界”;
wkWebView.LoadHtmlString(htmlString,null);
...
WebViewRenderer始终显示
Hello world
(如果未应用样式,则非常小):

/“WebViewRenderer”已过时:“WebViewRenderer从4.4.0开始已过时。请改用WkWebViewRenderer”
//WkWebViewRenderer继承自WKWebView
公共类MyWebViewRenderer:WkWebViewRenderer
{
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
var myWebView=(myWebView)e.NewElement;
如果(myWebView!=null)
{
...
}
WKWebView WKWebView=此;
var htmlString=“你好世界”;
wkWebView.LoadHtmlString(htmlString,null);
...
从我的网站上获得了答案,将其发布在这里。一个示例项目也上传到了那里

我发现您在Forms项目中使用了.Net Framework库,请将其删除并使用.Net标准HttpClient。 其次,尝试禁用特定URL的ATS,如:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>services.catholicbrain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
        </dict>
    </dict>
</dict>
从我的网站上得到答案,贴在这里。一个示例项目也上传到那里

我发现您在Forms项目中使用了.Net Framework库,请将其删除并使用.Net标准HttpClient。 其次,尝试禁用特定URL的ATS,如:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>services.catholicbrain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
        </dict>
    </dict>
</dict>

我已将完整的stacktrace添加到问题中。该堆栈跟踪不完整,你确定吗?是的,请检查我添加的示例项目。我已将完整的stacktrace添加到问题中。该堆栈跟踪不完整,你确定吗?是的,请检查我添加的示例项目。