2017-05-15 3 views
0

例 - https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/を実行してハイブリッドWebビューを作成しました。 Andriodプロジェクトでうまく動作しますが、iOSプロジェクトに問題があります。 OnElementChangedのオーバーライドでは、Elementプロパティは常にXamarin.Forms.Elementタイプであり、これは基本タイプであり、一般的なビュータイプ(TElement)ではありません。コードを何度も再チェックしましたが、修正が見つかりません。元のコードをダウンロードして実行すると、正常に動作します。問題は私のプロジェクトだけです。VisualElementRendererの要素は、汎用タイプではありません

私は一般的なTElement型を取得していない可能性がありますので、誰でも私にポインタを教えてください。元のプロジェクトでは、TElementタイプはHybridWebViewです。私の場合、私は別の名前を持っていますが、ほとんどすべて同じプロパティとメソッドを持っています。

以下は私のコードです。問題を再現するのは本当に簡単です。新しいXamarin.Formsソリューションを作成してコードを追加するだけです。あなたはこの嘘の問題を見るでしょう - var ele = Element; //ここELEMENTはPCLに

カスタムコントロールをSBMHybridWebViewされていない

iOSのレンダラは

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がありました。どういうわけか、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など)を共有しようとします。 –

関連する問題