我按照示例 - https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/创建了一个混合Web视图。它在Andriod项目中工作正常但我在iOS项目中遇到问题。在OnElementChanged重写中,Element属性始终是Xamarin.Forms.Element类型,它是基本类型而不是我的通用视图类型(TElement)。我已多次重新检查我的代码但找不到任何修复程序。如果我下载原始代码并运行它,它工作正常。问题只出现在我的项目中。
任何人都可以指点我为什么不能获得通用的TElement类型。在原始项目中,TElement类型是HybridWebView。我的名字不同,但几乎所有的属性和方法都有。
以下是我的一些代码。复制问题真的很容易。只需创建一个新的Xamarin.Forms解决方案并添加我的代码。你会看到这个谎言的问题 - var ele = Element; //这里的元素不是SBMHybridWebView
PCL中的自定义控件
public class SBMHybridWebView : Xamarin.Forms.View
{
}
iOS渲染器(我在课程中添加了ExportRenderer)
public class SBMHybridWebViewRenderer : ViewRenderer<SBMHybridWebView, WKWebView>, IWKScriptMessageHandler
{
const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
WKUserContentController userController;
protected override void OnElementChanged(ElementChangedEventArgs<SBMHybridWebView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
userController = new WKUserContentController();
var script = new WKUserScript(new NSString(JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
userController.AddUserScript(script);
userController.AddScriptMessageHandler(this, "invokeAction");
var config = new WKWebViewConfiguration { UserContentController = userController };
var webView = new WKWebView(Frame, config);
SetNativeControl(webView);
}
if (e.OldElement != null)
{
//Clean up code
}
if (e.NewElement != null)
{
var ele = Element; //ELEMENT HERE IS NOt SBMHybridWebView
}
}
public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)
{
//Element.InvokeAction(message.Body.ToString());
}
}
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:localcontrol="clr-namespace:App2.Control;assembly=App2"
x:Class="App2.View.Page1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<localcontrol:SBMHybridWebView Grid.Row="0" />
</Grid>
</ContentPage>
答案 0 :(得分:0)
我找到了我无法解释的原因。在我的iOS项目中,我将我的SBMHybridWebViewRenderer放在Renderer文件夹中。 Somehowm iOS不喜欢渲染器在文件夹中。将它移动到项目的根目录(但保持相同的命名空间)解决了这个问题。为什么?我不知道。无论我把文件放在哪里,我都希望它能够正常工作。
我以为我会发布这个,只是因为别人有同样的问题。