【问题标题】:Add items from NSSet to UITableView (convert NSSet to multiple arrays?)将 NSSet 中的项目添加到 UITableView(将 NSSet 转换为多个数组?)
【发布时间】:2013-06-17 03:43:05
【问题描述】:

我有一个 UITableView,它通过以下方式从核心数据中添加信息:

  1. 在标题中添加了各种名称的“类别”
  2. 与类别对应的名称应加载到类别下方的单元格中

现在我有标题加载正确的名称和正确数量的部分和要添加的行。但是 - Core Data 的结果作为 NSSet 返回,因此我无法根据 indexPath.row 将每个名称添加到单元格中。

有什么建议吗?供参考:

cell.textLabel.text = [NSString stringWithFormat:@"%@",[[[dataToUse objectAtIndex:indexPath.section]valueForKey:@"heldBy"]valueForKey:@"name"]];

将适当的名称集返回到相应部分的每个单元格,但它会将整个集合返回到每个单元格。我只想根据它所属的行添加每个名称。我可以通过将 NSSet 转换为 Array 来解决这个问题,但是由于创建了多个集合(因为有多个类别),我不知道该怎么做。

编辑:我通过执行以下操作解决了我的问题,但我仍然有兴趣知道最好的方法是什么。

NSSet *daset = [[dataToUse objectAtIndex:indexPath.section]valueForKey:@"heldBy"];
NSMutableArray *addToLabel = [[NSMutableArray alloc]init];
int i = 0;
for(NSSet *contact in daset) {
    [addToLabel insertObject:[contact valueForKey:@"name"] atIndex:i];
    NSLog(@"%@",addToLabel);
    i++;
}
cell.textLabel.text = [NSString stringWithFormat:@"%@",[addToLabel objectAtIndex:indexPath.row]];

【问题讨论】:

  • NSFetchedResultsController 完全符合您的需求(根据您的 CoreData 模型图将您的行组织成部分)。 Take a look at the docs here
  • 我的开发伙伴告诉我情况就是这样。我将坚持我的解决方案,这样我才能继续前进,但它是我的首要任务,让事情尽快恢复。谢啦!如果您将其作为答案发布,我会将其标记为已接受。
  • 不客气。我已经添加了答案,很高兴你发现它很有用。

标签: ios objective-c uitableview nsarray nsset


【解决方案1】:

使用NSFetchedResultsController

它旨在完全满足您的需求。对于像您这样的直截了当的情况,您只需要根据您的模型关系将数据组织成部分,它会通过自动管理获取、编辑、缓存等来减轻您的负担。您可以找到 a nice tutorial here 和当然是official documentation here

【讨论】:

    【解决方案2】:

    要从 NSSet->NSArray 转换,您需要使用 NSSortDescriptior 对集合进行排序。比如:

    NSSortDescriptor *sort=[[NSSortDescriptor alloc] initWithKey:@"nm" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    
      NSArray *arr = [[myset allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
    

    【讨论】:

    • 是的,获取的结果是一个数组(因为我这样做了),但它是一个 NSSet 数组。那有意义吗?因此,例如,我可以获得第一个 NSSet 的名称,但我需要每个 indexPath.row 的名称来表示关系(我称之为 @"heldBy"),它的 ITSELF 也是一个 Set,因为它就是这样返回的。
    【解决方案3】:

    NSSortDescriptor *sort=[[NSSortDescriptor alloc] initWithKey:@"name" 升序:YES 选择器:@selector(localizedCaseInsensitiveCompare:)];

    NSArray *arr = [[myset allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];

    "nsset 对象" *nssetObject =[arr objectAtIndex:indexPath.row];

    cell.textLabel.text = [NSString stringWithFormat:@"%@",nssetObject.name];

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多