我有一个或多或少基本的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类?
答案 0 :(得分:2)
您的表格视图根据名称排序。鉴于名称是固定的,如果您“手动”重新排序单元格然后返回到表视图,则会重新建立基于名称的排序。
要获得您想要的内容,您需要在Core Data模型中添加一个名为sortIndex
的字段。然后,您使用基于sortDescriptor
的{{1}}对表格进行排序;您可以将sortIndex
初始化为创建订单。当用户通过UI重新排序单元格时,您还将更改所有受影响的单元格/托管对象的sortIndex
。然后,由于sortIndex
是Core Data模型的一部分,当用户结束并重新启动您的App时,将重新建立他们的首选排序。
有时,出于建模原因,您不希望在某些托管对象中直接包含sortIndex
。例如,sortIndex
有名字和姓氏,但不是Person
(事实上)。您可以创建一个关联,可能是一个sortIndex
托管对象,在DisplayPreferences
和Person
之间建立一对一的映射,并在{{1}中设置DisplayPreferences
}}
答案 1 :(得分:0)
您需要在此处查看一些内容:
performFetch:
来实际执行第一次获取。要么在getter方法中执行此操作,要么应在viewDidLoad
中完成。controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
,controller:didChangeSection:atIndex:forChangeType:
和controllerDidChangeContent:
。代码都是样板,但你需要确保它在那里。您的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];
}
确保使用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;
}