gpt4 book ai didi

ios - NSFetchedResultsController - 与部分名称不同的排序顺序

转载 作者:技术小花猫 更新时间:2023-10-29 10:30:17 27 4
gpt4 key购买 nike

我有一个 NSManagedObject 用于分组的 UITableView 中的部分。该对象具有属性“name”和“createdAt”。我想在 te UI 中使用“名称”作为部分标题,但按“createdAt”排序。根据文档,第一个 sortDescriptor 键必须也是 NSFetchedResultsController 的 sectionNameKeyPath。

我建议使用两个 sortDescriptor,但它不起作用。这些部分仍然按名称排序。

- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:[CoreDataHelper instance].managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortName, sortDate, nil]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[CoreDataHelper instance].managedObjectContext sectionNameKeyPath:@"name"
cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;

return _fetchedResultsController;
}

最佳答案

获取结果 Controller (FRC) 仅使用第一个排序描述符将对象分组(和排序)到部分中。可以添加第二个排序描述符来对每个部分中的对象进行排序。

此外,排序描述符的关键路径必须与 FRC 的 sectionNameKeyPath 相同(或者至少生成相同的相对顺序)。

另见 Creating a Fetched Results Controller在《核心数据编程指南》中:

... In this example you add one more NSSortDescriptor instance to theNSFetchRequest instance. You set the same key from that new sortdescriptor as the sectionNameKeyPath on the initialization of theNSFetchedResultsController. The fetched results controller uses thisinitial sort controller to break apart the data into multiple sectionsand therefore requires that the keys match.

对于您的情况,您可以按如下方式进行:

  1. 在第一个排序描述符中使用 createdAt 作为 sectionNameKeyPath

  2. 修改 titleForHeaderInSection 委托(delegate)函数以返回 name 属性而不是 createdAt:

     - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
    return [[[sectionInfo objects] objectAtIndex:0] name];
    }

注意:如果您有多个具有相同 namecreateAt 值不同的对象,这些对象将被分组到上面的不同部分方法。我不知道这对您来说是否是个问题。

关于ios - NSFetchedResultsController - 与部分名称不同的排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12657121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com