在表视图部分中排序核心数据对象

时间:2014-01-28 18:57:01

标签: ios uitableview core-data

我正在使用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;
}

2 个答案:

答案 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"