尝试使用 NSFetchedResultsController 重新排序 UITableView
Attempting to reordering UITableView using an NSFetchedResultsController
我试图在使用核心数据和 NSFetchedResultsController 时编辑我的 UITableView 的顺序。据我了解,Core Data 没有用于在 Core Data 模型中重新排列对象的内置方法。
我的想法是创建一个数组,在那里重新排序我的对象,然后将该数据写回我的模型。
NSFetchedResultsController
-(NSFetchedResultsController *) fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context = [self managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"List" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listName" 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
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath; {
NSMutableArray *toDoItems = [[self.fetchedResultsController fetchedObjects] mutableCopy];
NSManagedObject *managedObject = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath];
[toDoItems removeObject:managedObject];
[toDoItems insertObject:managedObject atIndex:[destinationIndexPath row]];
int i = 0;
for (NSManagedObject *moc in toDoItems) {
[moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"];
}
[self.managedObjectContext save:nil];
}
当我点击 Edit
按钮时,我可以重新排列行,但一旦我松开行,我的应用程序就会崩溃。当它崩溃时,我在控制台中没有得到任何类型的堆栈跟踪。
我在异常上设置了一个断点,它似乎在这一行崩溃了
[moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"];
我的密钥名称是正确的。但我现在意识到这是完全错误的,因为我试图将其设置为一个数字,但事实并非如此。
我们将不胜感激任何正确方向的建议或推动。
不要复制 NSManagedObject。它是由核心数据管理的对象。如果你想要一个新的,请询问上下文。
要么 修改您的代码以设置 listName
的字符串值,如下所示:
[moc setValue:[NSString stringWithFormat:"%d",i++] forKey:@"listName"];
(但请注意,因为默认情况下这将按字符串排序,因此 11 在 2 之前,依此类推)。
所以,更好的是, 向您的模型添加一个整数属性,并使用它对获取的结果控制器进行排序。
我试图在使用核心数据和 NSFetchedResultsController 时编辑我的 UITableView 的顺序。据我了解,Core Data 没有用于在 Core Data 模型中重新排列对象的内置方法。
我的想法是创建一个数组,在那里重新排序我的对象,然后将该数据写回我的模型。
NSFetchedResultsController
-(NSFetchedResultsController *) fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context = [self managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"List" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listName" 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
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath; {
NSMutableArray *toDoItems = [[self.fetchedResultsController fetchedObjects] mutableCopy];
NSManagedObject *managedObject = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath];
[toDoItems removeObject:managedObject];
[toDoItems insertObject:managedObject atIndex:[destinationIndexPath row]];
int i = 0;
for (NSManagedObject *moc in toDoItems) {
[moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"];
}
[self.managedObjectContext save:nil];
}
当我点击 Edit
按钮时,我可以重新排列行,但一旦我松开行,我的应用程序就会崩溃。当它崩溃时,我在控制台中没有得到任何类型的堆栈跟踪。
我在异常上设置了一个断点,它似乎在这一行崩溃了
[moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"];
我的密钥名称是正确的。但我现在意识到这是完全错误的,因为我试图将其设置为一个数字,但事实并非如此。
我们将不胜感激任何正确方向的建议或推动。
不要复制 NSManagedObject。它是由核心数据管理的对象。如果你想要一个新的,请询问上下文。
要么 修改您的代码以设置 listName
的字符串值,如下所示:
[moc setValue:[NSString stringWithFormat:"%d",i++] forKey:@"listName"];
(但请注意,因为默认情况下这将按字符串排序,因此 11 在 2 之前,依此类推)。
所以,更好的是, 向您的模型添加一个整数属性,并使用它对获取的结果控制器进行排序。