问题描述
|
当用户按下\“按字母顺序排序\”时,我为表调用以下方法:
- (void) sortByName
{
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@\"name\" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor,nil];
NSMutableArray *items = [[fetchedResultsController fetchedobjects] mutablecopy];
[items sortUsingDescriptors:sortDescriptors];
int newdisplayOrder = 0;
for (NSManagedobject *managedobject in items)
{
[managedobject setValue:[NSNumber numberWithInt:newdisplayOrder++ ] forKey:@\"displayOrder\"];
}
[sortDescriptor release];
[sortDescriptors release];
// Save the context.
NSError *error = nil;
if (![self.managedobjectContext save:&error])
{
// Need code to handle error properly
NSLog(@\"Unresolved error %@,%@\",error,[error userInfo]);
abort();
}
}
但是由于某种原因,它似乎不是按字母顺序排序,而是将每个项目按其创建的顺序放置。我究竟做错了什么?
解决方法
看起来不错。
您是否已设置获取结果控制器以根据ѭ1进行排序?
另外,您应该释放代码中的项目...
,似乎您没有使用已排序的数组刷新tableview。我在一个项目中使用以下方法根据状态和名称对联系人数组进行排序:
- (void)refresh {
if ([NSThread isMainThread]) {
NSSortDescriptor *descriptorStatus = [[[NSSortDescriptor alloc] initWithKey:@\"status\" ascending:NO selector:@selector(statusCompare:)] autorelease];
NSSortDescriptor *descriptorName = [[[NSSortDescriptor alloc] initWithKey:@\"displayName\" ascending:YES] autorelease];
[contactArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptorStatus,descriptorName,nil]];
[tableView reloadData];
} else {
[self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];
}
}
对于您的项目,您可能不必检查是否对主线程执行了刷新,除非从除主线程之外的任何其他线程检索数据。
,尝试这个:
NSMutableArray *items = [NSMutableArray arrayWithArray:fetchedResultsController.fetchedObjects];
或一步一步完成(不需要是可变的):
NSArray *items = [fetchedResultsController.fetchedObjects sortedArrayUsingDescriptors:sortDescriptors];
顺便说一句,这似乎是对表进行排序的一种复杂方法。您正在数据库中修改displayIndex以反映新的排序顺序。大概NSFetchRequest驱动fetchedResultsController正在基于displayIndex进行排序。
这样会更简单,不需要更改数据库即可简单地更改fetchRequest并重新配置fetchedResultsController。
从NSFetchedResultsController文档:
修改提取请求
你不能
只需将获取请求更改为
修改结果。如果你想
更改获取请求,您必须:
如果使用缓存,请删除它
(使用deleteCacheWithName :)。
通常,您不应该使用缓存
如果您正在更改获取请求。
更改获取请求。调用
performFetch :。
,为什么在获取对象时不设置排序描述符。