2016-05-18 7 views
1

Xamarin.iOSを使用する際に重大な問題が発生しています。C#Xamarin - SetValueForKeyを使用してUICollectionViewCellにデータをバインドする

私はMVC5のWeb背景から来ており、DOM要素にデータをバインドすることがよくあります(JS data-属性など)。私はXamarin.iOSで同様のパターンを達成したい。

私はXamarinのドキュメント(いつも古いバージョンのフレームワークに基づいているようです)から収集したものを、KVCパターンを使用してUICollectionViewCellにバインドする必要があります。

public class MyClassCollectionViewCell : UICollectionViewCell 
{ 
    [Outlet] 
    UILabel NameLabel { get; set; } 

    public BaseCell (IntPtr handle) : base (handle) 
    { 
     this.NameLabel = new UILabel(); 
    } 

    public virtual void UpdateCell(MyClass myClassObject) 
    { 
     // Display the "Name" within the UILabel outlet 
     this.NameLabel.Text = myClassObject.Name; 

     // This being my custom cell which inherits from UICollectionViewCell 
     this.SetValueForKey(myClassObject, "BoundMyClassObject"); 

     // remainder omitted for brevity 
    } 
} 

とMyClass.cs(再び、それは本当の名前だが、説明のためではない)

は私てupdateCellメソッド内SetValueForKey(NSObject object, NString key)(:私は一般的なことのparamsを変更した注)を呼び出す最善の方法であり、

public class MyClass 
{ 
    [JsonProperty("Id")] 
    public int Id { get; set; } 

    [JsonProperty("Name")] 
    public string Name { get; set; } 

    // more props omitted for brevity 
} 

は私がバインドしようとしているオブジェクトがNSObjectから継承されていないため、SetValueForKeyでは動作しないという問題です。

オブジェクトをセルにバインドし、セルをタップし、セルにバインドされたデータを取得し、最後にバインドされたデータを使用してRESTコールを作成したいと考えています。

これはなぜですか?さて、私は、 "Name" MyClassプロパティがUICollectionViewCellのラベルに表示され、 "Id"がREST呼び出しのためにアクセス可能で、ユーザーには表示されないようにします。現在、ラベルはTapGestureが動作するように見えますが、myClassObject.Idの値を取得することができないため、Web呼び出しを行うことはできません!

UITapGestureRecognizerは私のUICollectionViewControllerUICollectionViewまで配線されている - 質問のスコープのために必要でないコード)とcorrently ...

イベントが発生しますが、JSONとして投稿するキー「BoundMyClassObject」またはmyClassObject.Idの値が必要です

意味がありますか?

Xamarinのドキュメントやフォーラムにはほとんど情報がありませんので、私を助けてください。

すべてのベストは、ここの記事で出

ジョン

EDIT

@AdamKempとしてポイントがSetValueForKeyNSObjectのためのものです。

を次のようにだから私は[登録( "MyClassの)] パブリッククラス私のクラスMyClass.csでコードをリファクタリング:NSObjectの { 公共のMyClass(){}

public MyClass(int ID) 
    { 
     this.Id = ID; 
    } 

    private int _Id = 0; 
    [Export("Id")] 
    public int Id 
    { 
     get 
     { 
      return _Id; 
     } 
     set 
     { 
      WillChangeValue("Id"); 
      _Id = value; 
      DidChangeValue("Id"); 
     } 
    } 

    // same for Name property 
} 

しかし、I電話番号SetValueForKey私のUpdateCell

MyClass myClassObject = newMyClass(7); // int passed to constructor for illustration in my real code it's dynamic 

    this.SetValueForKey(myClassObject, "MyClassObject"); 

私は私UICollectionViewCellクラスに次のプロパティを追加し、次のエラー

Foundation.MonoTouchException: Objective-C exception thrown. Name: NSUnknownKeyException Reason: [<UICollectionViewCell 0x7e433a30> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key MyClassObject. 

答えて

1

さて、

が発生します。また、

[Export("Id")] 
NSNumber Id { get; set; } 
[Export("Name")] 
NSString Name { get; set; } 

そしてSetValueForKey

this.SetValueForKey(new NSNumber(7), 
        new NSString("Id")); 
に渡される引数を変更します

次に、値7を正しく割り当てますこのUICollectionViewCellのプロパティプロパティはすべて[Export]で修飾されている必要があります。

実際にはMyClass.csは必要ありません。カスタムUICollectionViewCell内にプロパティを配置し、SetValueForKeyを呼び出して初期化する場合は、

そして、彼らはその後、あなたは、必要に応じてこの呼び出しから取得したデータを使用して、データアクセス層に渡すことができ

NSNumber instanceID = (NSNumber)cell.ValueForKey(new NSString("Id")); 

を使用して任意の場所に読み出すことができます。

脇に、SetValueForKeyメソッドは、NSObject(またはこれの子)が最初の引数として期待しています。私はバインディング簡単にデータのNSDateにC#のDateTimeを変換するための拡張メソッドを作ったので、うるさくNSDateは痛みをすることができます:

public static NSDate DateTimeToNSDate(DateTime date) 
{ 
    return NSDate.FromTimeIntervalSinceReferenceDate((date - (new DateTime(2001, 1, 1, 0, 0, 0))).TotalSeconds); 
} 

public static DateTime NSDateToDateTime(NSDate date) 
{ 
    return (new DateTime(2001, 1, 1, 0, 0, 0)).AddSeconds(date.SecondsSinceReferenceDate); 
} 

最後に、データバインディングの詳細については、 this Xamarinのチュートリアルを参照してください。

これが将来の人々に役立つことを願っています! (こんにちは、未来の人々 - まだ特異点はありますか?)

関連する問題