2

これまでのところ、私が見つけることができるすべての例は、CoreDataとNSArrayControllerの間の直接バインディングです。つまり、各NSArrayControllerは正確に1つのエンティティをマップします。

NSArrayControllerに入力されるものをカスタマイズする方法はありますか?

たとえば、私には2つのエンティティがあります。

FileMetaData
    ID
    FileName
    FileSize
    Owner(relationship m..1 to SystemUser)

SystemUser
    ID
    FirstName
    LastName
    Files(relationship 1..m to FileMetaData)

2つの列を持つテーブルビューにデータを入力するためのNSArrayControllerが1つあります。1つは「FileName」で、もう1つは「UserName」です。UserNameは、SystemUserエンティティのFirstName+Lastnameから取得されます。NSArrayControllerは、FileMetaDataとバインドするように設定されています。

これを行うための最良の方法は何ですか?ありがとう。

4

2 に答える 2

1

UserNameプロパティ(FirstName+ )を簡単に取得する1つの方法は、適切に連結されたプロパティとプロパティを返すメソッドを使用して、クラスにLastNameカテゴリを定義することです。SystemUserUserNameFirstNameLastName

次に、さまざまなバインディングで、プロパティにバインドできUserNameます。ブラウザに直接入力されたため、テストされていないため、UISupport(または他の名前の)カテゴリSystemUserは次のようになります。

// In SystemUser+UISupport.m

- (NSString *)userName
{
    return [NSString stringWithFormat: @"%@ %@", self.FirstName, self.LastName];
}

FirstNameまたはプロパティが変更された場合にバインディングが機能するようにするには、LastNameこのメソッドも実装することをお勧めします。

+(NSSet*)keyPathsForValuesAffectingUserName
{
    return [NSSet setWithObjects: @"self.FirstName", @"self.LastName", nil];
}

最後に、完全を期すために、ヘッダーファイルでnew-fangled読み取り専用プロパティを宣言できます。

// In SystemUser+UISupport.h

@property (readonly) NSString *userName;
于 2012-06-13T20:21:22.380 に答える
0

Monoloのソリューションは私のものよりも優れていると思いますが、代わりに、私のソリューションも投稿します。

私のアプローチは、SystemUser.mに新しい「displayName」フィールドを追加することです。そして、NSManagedObjectのwillSave()メソッドを実装します。

-(void)willSave
{
    if (self.displayName == nil)
    {
        self.displayName = [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
    }
}

このようにして、CoreDataがエンティティを保存しようとする前にdisplayNameフィールドが更新されます。

于 2012-06-14T12:38:38.010 に答える