2012-06-13 2 views
2

До сих пор все примеры, которые я могу найти, являются прямым связыванием между Core Data и NSArrayController. Это означает, что каждый NSArrayController отображает ровно одну сущность.Лучший способ настроить, как данные ядра заполняются NSArrayController

Есть ли способ настроить то, что заселяется в NSArrayController?

К примеру, у меня есть две сущности:

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

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

У меня есть один NSArrayController для заполнения TableView, который имеет два столбца, один «FileName», а другой является «UserName». Имя пользователя происходит от FirstName + Lastname в объекте SystemUser. NSArrayController настроен на привязку с FileMetaData.

Каков наилучший способ для этого? Благодарю.

ответ

1

Один из способов легко получить UserName недвижимость (FirstName + LastName) является определение категории на SystemUser класса с UserName метод, который возвращает FirstName и LastName свойства надлежащим образом сцепляются.

Затем в ваших различных привязках вы можете привязываться к свойству 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]; 
} 

Наконец, для полноты картины, вы можете объявить свое новомодное свойство только для чтения в файле заголовок:

// In SystemUser+UISupport.h 

@property (readonly) NSString *userName; 
+0

Спасибо! Я сделал это с добавлением другого поля в классе SystemUser и обновил поле fullName с помощью метода willSave() NSManagedObject. Но я думаю, что ваш путь - лучший подход. –

0

Я думаю, что решение Monolo лучше моего, но только для альтернативы я отправлю свое решение.

Мой подход заключается в том, чтобы добавить новое поле «displayName» в SystemUser.m. И реализуйте метод willSave() NSManagedObject.

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

Таким образом, поле displayName обновляется до того, как CoreData попытается сохранить объект.

 Смежные вопросы

  • Нет связанных вопросов^_^