使用 NSSet 关系填充 cellForRow

Posted

技术标签:

【中文标题】使用 NSSet 关系填充 cellForRow【英文标题】:using NSSet relationship to populate cellForRow 【发布时间】:2011-04-09 02:36:00 【问题描述】:

我浏览了很多帖子,但仍然不知道如何解决这个问题。希望有人能帮忙。

它一直有效,直到到达最后一个数据源方法 cellForRow。 那时我可以为每个部分获得正确的 NSSet,但无序。对关系属性的内省如何对行起作用?

在 cellForRow 中使用字符串文字,我确实在每个部分中获得了正确的行数,但显然与那里的托管对象没有连接。

如何填充 NSSet 关系中的行?感谢所有见解

类别>人物 cName ---------- pName

关系 人 ---------- 类别

- (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】:

您的问题是您正在获取 Category 对象,但您正在尝试使用 Person 对象设置您的行。 Person 对象是无序的,因为它们不是获取的对象。它们与 tableview 的逻辑结构没有关系。事实上,它们不能,因为它们与Category 具有一对多关系,因此同一个Person 对象可以在同一个表中多次出现。

最好的解决方案是将其分解为两个层次结构表。一个显示类别列表,第二个显示在第一个表视图中选择的Category 对象的people 关系中的Person 对象。

您可以尝试通过以下方式使其与当前设计一起使用:

- (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;

如果您的数据是静态的,这将起作用。如果它在表格显示时发生变化,您将遇到麻烦。它将产生一些开销,因为每次填充一行时,您都必须获取和排序 sectionCategory 对象的所有 Person 对象。

我强烈推荐两个 tableview 解决方案。这是分层数据的首选解决方案。

【讨论】:

非常感谢您的意见。如果我理解正确,我想以首选方式执行此操作,并且实际上显示一个列表并推送相关对象没有问题。我想看看多合一的样子。当我尝试代码时,我在 sortWithKey 上收到了一个“无法识别的 sel”:你能想出任何合理的方法来做到这一点,比如创建字典来为电视提供内容吗? 很可能我在sortWithKey 中弄错了属性名称。被排序的对象必须具有pname 属性。如果我误解了您的模型,只需替换适当的属性名称即可。 TechZen - 是的,对不起,我在发表评论后意识到这只是一个名称问题。(我发布的代码有点不对劲,我的错)你是对的。感谢您的建议和时间帮助解决此问题,并且还将寻找其他更好的方法来完成我在这里尝试的工作。再次感谢!

以上是关于使用 NSSet 关系填充 cellForRow的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSSet 填充 tableView? (迅速)

NSPredicate 通过 NSSet 搜索

从 NSSet 获取对象并填充 TableView

将 UILabel 添加到 CellForRow 中的 UIImageView

iOS核心数据一对多关系NSSET

使用 NSSortDescriptor 对一对多关系的 NSSet 类型的数据进行排序