예제 - https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/을 따라 하이브리드 웹보기를 만들었습니다. Andriod 프로젝트에서는 제대로 작동하지만 iOS 프로젝트에 문제가 있습니다. OnElementChanged 재정의에서 Element 속성은 항상 Xamarin.Forms.Element 유형이며 기본 형식이며 내 일반 뷰 유형 (TElement)은 아닙니다. 코드를 여러 번 다시 검사했지만 수정 사항을 찾을 수 없습니다. 원래 코드를 다운로드하여 실행하면 정상적으로 작동합니다. 문제는 내 프로젝트에만 있습니다.VisualElementRenderer의 요소가 제네릭 유형이 아닙니다.
일반 TElement 유형을 얻지 못하는 이유는 누구에게도 알려 줄 수 있습니까? 원래 프로젝트에서 TElement 유형은 HybridWebView입니다. 내 이름에는 다른 이름이 있지만 거의 모든 속성과 메서드가 있습니다.
다음은 제 코드입니다. 문제를 복제하는 것은 정말 쉽습니다. 새로운 Xamarin.Forms 솔루션을 만들고 코드를 추가하십시오. 이 거짓말에 문제가 표시됩니다. - var ele = Element; // 여기 ELEMENT는 PCL에
사용자 정의 컨트롤을 SBMHybridWebView되지
아이폰 OS 렌더러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>
public class SBMHybridWebView : Xamarin.Forms.View
{
}
코드에 관련된 부분을 질문에 추가하십시오. 더 많은 정보없이 도움을받는 것은 매우 어렵습니다. –
게시글을 편집했습니다 – Amitesh