我正在使用NSSortDescriptors来订购核心数据对象,并根据日期属性创建表格视图部分。使用这种SortDescriptor,表视图部分按预期排序,但部分内的行也按相同的日期属性排序。有没有办法在每个部分内部建立另一个订购系统?我想主要问题是核心数据存储日期对象的日期+时间值,这样就没有具有完全相同日期值的对象。但我需要根据另一个属性在同一部分内对对象进行排序。 谢谢。
这是我的NSFetchedResultsController的代码:
-(NSFetchedResultsController*)fetchedResultsController{
if (_fetchedResultsController != nil){
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSManagedObjectContext *context = self.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"itemDate" ascending:YES];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc]initWithKey:@"itemName" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor,sortDescriptor1, nil];
fetchRequest.sortDescriptors = sortDescriptors;
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"sectionIdentifier" cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
编辑问题
这是添加到cellForRowAtIndexPath方法的代码:
int indexpathsection = indexPath.section;
[self sortedSectionForIndex:indexpathsection];
NSLog(@"INDEXPATH= %ld", (long)indexPath.section);
这就是马库斯提出的方法:
- (NSArray*)sortedSectionForIndex:(NSInteger)index
{
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"priority" ascending:YES];
id section = [[self fetchedResultsController] sections][index];
NSLog(@"INDEX********* = %ld", (long)index);
NSArray *objects = [section objects];
NSArray *sorted = [objects sortedArrayUsingDescriptors:@[sort]];
return sorted;
}
答案 0 :(得分:1)
NSFetchedResultsController
用于通过单个排序或一组排序控制的排序顺序。它并不打算做你想做的事。
但你可以做到,它不是那么干净。
首先,讨论排序部分。这不需要您编写自己的排序算法:
- (NSArray*)sortedSectionForIndex:(NSInteger)index
{
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"MyKey" ascending:YES];
id section = [[self fetchedResultsController] sections][index];
NSArray *objects = [section objects];
NSArray *sorted = [objects sortedArrayUsingDescriptors:@[sort]];
return sorted
}
使用该方法,您可以在要检索对象时要求对某个部分进行排序。但是,每当您想要触摸UITableViewController
中 LOT 的对象时,您就会进行排序。
相反,请使用此示例并将其与您的NSFetchedResultsController
及其委托方法集成,以便存储已排序的数组并使它们保持同步。这样,您只在数据更改时进行排序,而不是在每次方法调用时进行排序。
我提供给您的排序代码不会对NSFetchedResultsController
中的 内容进行排序。它采用该部分中的内容,对其进行排序并返回已排序的数组。所以你需要使用它返回的内容:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *sorted = [self sortedSectionForIndex:[indexPath section]];
id object = [sorted objectAtIndex:[indexPath row]];
id cell = ...; //Now get your cell reference
//Now update your cell with the data from object
return cell;
}
答案 1 :(得分:0)
您可以使用awakeFromFetch
的{{1}}方法规范化属性的时间组件。
NSManagedObject
此外,查看代码时,您必须告诉- (void) awakeFromFetch {
[super awakeFromFetch];
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:self.itemDate];
self.itemDate = [[NSCalendar currentCalendar] dateFromComponents:comps];
}
它应该基于分节符的内容。您可以通过在初始化时为分节符提供keyPath来执行此操作。对于您的情况,请使用第一个排序键:
NSFetchedResultsController
sectionNameKeyPath:@"sectionIdentifier"