如何解决Xamarin.iOS WebView在第10次重新加载后消失
我在Xamarin中获得了基本的WebView。表单如下:
<WebView AbsoluteLayout.LayoutBounds="0,1,1" AbsoluteLayout.LayoutFlags="All" x:Name="ChartWebView" Style="{StaticResource BackgroundStyle}">
<WebView.source>
<HtmlWebViewSource Html="{Binding ChartHTML}" />
</WebView.source>
</WebView>
我使用WebView来显示Chart.js图表,该图表工作得很好。在我的页面上,我有一个按钮,用户可以在其中请求数据。
private async Task RequestData()
{
//Doing some stuff to get data ...
BuildChartHTML();
}
private void BuildChartHTML()
{
var html = GetChartJSConfigString();
Device.BeginInvokeOnMainThread(() =>
{
ChartWebView.source = new HtmlWebViewSource
{
Html = html
};
});
}
但是,仅在iOS上,每次恰好在第10次请求/重新加载时,WebView都会变为空白。之后,它也保持空白。我需要重新导航至此页面才能重新启动并运行。我尝试按照this线程中所述调整WebView.Navigated
上的高度,但没有成功。
在具有相同代码库的Android上不会出现此问题。
PS:很明显,我确保所加载的html没有损坏。我加载了10次相同的数据,并比较了WebView损坏的第10次加载的html。它是完全相同的HTML字符串。
解决方法
原来是iOS WKWebView
和使用HTML canvas
(chart.js在画布上渲染)的问题。
在调试到我的WebView(愚蠢的我之前没有考虑过这种可能性)之后,我发现画布内存超出了限制。在发布的here解决方案的帮助下,我设法避免了这个问题。
请记住,此解决方案有些棘手。基本上,正如上面的链接中所指出的,我所做的就是每次重新加载图表时都会“删除”画布。 “删除”是指将画布设置为width
,将height
设置为零。将解决方案应用于我的代码,如下所示:
在我在浏览器中运行的javascript中,我添加了如下功能:
function deleteCanvas() {
//Get the main canvas where the chart is rendered to
var chart = document.getElementById('chart');
chart.height = 0;
chart.width = 0;
}
然后每次我调用BuildChartHTML()
函数时,我都会在C#代码中调用此方法,如下所示:
Device.BeginInvokeOnMainThread(() =>
{
ChartWebView.Source = new HtmlWebViewSource
{
Html = html
};
ChartWebView.Eval("deleteCanvas()");
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。