используя отношение NSSet для заполнения cellForRow - PullRequest
1 голос
/ 09 апреля 2011

Я просмотрел много сообщений и до сих пор не уверен, как решить эту проблему. Надеюсь, что кто-то может помочь.

Работает до последнего метода источника данных, cellForRow. В этот момент я могу получить правильный NSSet для каждого раздела, но неупорядоченный. Как интропекция в свойствах отношений работает для строк?

используя строковый литерал в cellForRow Я получаю правильное количество строк в каждом разделе, но, очевидно, нет связи с управляемыми объектами, которые там будут.

Как заполнить строки из отношения NSSet? Все понимание приветствуется

Категория << --- >> Person
cName ---------- pName

1012 * Отношения * люди ---------- категории

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[self.fetchedResultsController fetchedObjects] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section     {
Category* cat = [[self.fetchedResultsController fetchedObjects] objectAtIndex:section];
return [[cat people] count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
Category* cat = [[self.fetchedResultsController fetchedObjects] objectAtIndex:section];
NSNumber *rowCount = [NSNumber numberWithUnsignedInteger:[[cat people] count]]; 
return cat.cName;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
NSManagedObject *mo = [[fetchedResultsController fetchedObjects] objectAtIndex:index.row]];

// returns the correct set but unordered, possibly work with this to populate the rows?
//NSSet *theSet = [[NSSet alloc] initWithSet: [mo valueForKeyPath:@"people.pName"]];

// doesn't work
// cell.textLabel.text = [NSString stringWithFormat:@"%@",[mo valueForKeyPath:@"people.pName"]];

cell.textLabel.text = @"something";
return cell;
}

1 Ответ

0 голосов
/ 11 апреля 2011

Ваша проблема в том, что вы выбираете Category объекты, но вы пытаетесь установить строки с Person объектами. Объекты Person неупорядочены, поскольку они не являются выбранными объектами. Они не имеют никакого отношения к логической структуре таблицы. Фактически, они не могут этого сделать, потому что у них есть отношение ко-многим с Category, так что один и тот же объект Person может много раз появляться в одной и той же таблице.

Лучшее решение - разложить это на две иерархические таблицы. Один отображает список категорий, а второй отображает объекты Person в отношении people объекта Category, выбранного в первом представлении таблицы.

Вы можете попытаться заставить его работать с текущим дизайном, попробовав что-то вроде:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    Category *sectionCategory=[[fetchedResultsController fetchedObjects] objectAtIndex:indexPath.section];
    NSSortDescriptor *sort=[NSSortDescriptor sortWithKey:@"pname" ascending:NO];
    NSArray *sortedPersons=[sectionCategory.people sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
    Person *rowPerson=[sortedPersons objectAtIndex:indexPath.row];
    cell.textLabel.text = rowPerson.pname;

Это будет работать, если ваши данные статичны. Если он изменится во время отображения таблицы, у вас будут проблемы. Это потребует некоторых накладных расходов, потому что вам нужно извлекать и сортировать все объекты Person объекта sectionCategory каждый раз, когда вы заполняете строку.

Я настоятельно рекомендую решение с двумя таблицами. Это предпочтительное решение для иерархических данных.

...