在查看详细信息视图并返回后,NSSortDescriptor按字母顺序重新排序单元格

时间:2014-05-04 18:54:28

标签: ios objective-c core-data uitableview nsfetchedresultscontroller

我有一个或多或少基本的Master Detail应用程序。我跟着this tutorial熟悉了Core Data,现在我正试着在我的Master TVC上重新排序我的单元格。一切都很好,包括我的细胞成功重新排序。然而,当我挖掘并查看其中一个细节VC时,我将返回原始的按字母排序的顺序。我认为它与NSSortDescriptor" sortDescriptor"有关。这包含在教程中。我不知道如何删除它,或者如何赋予它不同的特性。任何帮助表示赞赏。以下是我的NSFetchedResultsController方法。

-(NSFetchedResultsController*) fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSManagedObjectContext *context = [self managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Top" inManagedObjectContext:context];

    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"topName" ascending:YES];

    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    fetchRequest.sortDescriptors = sortDescriptors;

    _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

修改 经过过去几天的大量研究,我发现我的moveRowAtIndexPath方法存在更多问题。任何人有任何建议或建议使用核心数据和重新排序细胞的能力?此外,这是否需要自定义tableviewcell类?

2 个答案:

答案 0 :(得分:2)

您的表格视图根据名称排序。鉴于名称是固定的,如果您“手动”重新排序单元格然后返回到表视图,则会重新建立基于名称的排序。

要获得您想要的内容,您需要在Core Data模型中添加一个名为sortIndex的字段。然后,您使用基于sortDescriptor的{​​{1}}对表格进行排序;您可以将sortIndex初始化为创建订单。当用户通过UI重新排序单元格时,您还将更改所有受影响的单元格/托管对象的sortIndex。然后,由于sortIndex是Core Data模型的一部分,当用户结束并重新启动您的App时,将重新建立他们的首选排序。

有时,出于建模原因,您不希望在某些托管对象中直接包含sortIndex。例如,sortIndex有名字和姓氏,但不是Person(事实上)。您可以创建一个关联,可能是一个sortIndex托管对象,在DisplayPreferencesPerson之间建立一对一的映射,并在{{1}中设置DisplayPreferences }}

答案 1 :(得分:0)

您需要在此处查看一些内容:

  1. 您需要通过在NSFetchedResultsController上调用performFetch:来实际执行第一次获取。要么在getter方法中执行此操作,要么应在viewDidLoad中完成。
  2. 您是否正确实施了所需的NSFetchedResultsControllerDelegate方法?其中包括controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:controller:didChangeSection:atIndex:forChangeType:controllerDidChangeContent:。代码都是样板,但你需要确保它在那里。
  3. 您的UITableViewDatasource方法是什么样的?确保节和行计数如下所示:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return [[[self fetchedResultsController] sections] count];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
        return [sectionInfo numberOfObjects];
    }  
    
  4. 确保使用indexPath在tableView:cellForRowAtIndexPath:方法中抓取对象。看起来应该是这样的:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCellIdentifier"];
        NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
        cell.textLabel.text = rowPackage.title;
    
        return cell;
    }