2017-05-15 9 views
0

예제 - 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>
(오프 물론 나는 ExportRenderer를 추가 한)
public class SBMHybridWebView : Xamarin.Forms.View 
{ 
} 

+0

코드에 관련된 부분을 질문에 추가하십시오. 더 많은 정보없이 도움을받는 것은 매우 어렵습니다. –

+0

게시글을 편집했습니다 – Amitesh

답변

0

내가 설명 할 수없는 원인을 발견했습니다. 내 iOS 프로젝트에서 Renderer 폴더에 SBMHybridWebViewRenderer가 있습니다. Somehowm iOS는 렌더러가 폴더에있는 것을 좋아하지 않습니다. 프로젝트의 루트로 이동하지만 (동일한 네임 스페이스를 유지) 문제가 해결되었습니다. 왜? 나는 모른다. 나는 그것이 파일을 어디에 두든 관계없이 작동 할 것으로 기대했을 것이다.

나는 누군가에게 똑같은 문제가 발생하면 이것을 게시 할 것이라고 생각했다.

+0

iOS 프로젝트에 원하는 곳 어디에서나 렌더러를 배치 할 수 있어야합니다. 폴더는 중요하지 않습니다. 어쩌면 네임 스페이스와 관련이 있을까요? –

+0

네임 스페이스와 관련이 없습니다. 나는 그것을 시험해 보았다. 렌더링이 루트 폴더에 있어야합니다. 원래 네임 스페이스를 유지할 수 있습니다. 이걸 시험해 볼 수 있습니다. 샘플 프로젝트를 만들고 -https : //developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/에서 코드를 복사하는 데 5 분 밖에 걸리지 않습니다. 상속받은 코드는주의하십시오. ViewRenderer로부터 취득 해, ButtonRenderer 나 LabelRenderer 등의 통상의 렌더러로부터 상속 한 것은 아닙니다. 정상적인 것들이 잘 작동합니다. – Amitesh

+0

깨끗한 프로젝트에서 질문의 코드로 가능한 모든 변형을 시도했습니다. 'Element'는 항상 올바른 타입 ('SBMHybridWebView')입니다. 어쩌면 거기에 어떤 타입이 있는지 알려주는 것이 도움이 될 것입니다. 또는 샘플 프로젝트를 공유하려고 시도하십시오 (예 : Github 통해). –