有没有人遇到过这个?
当我选择从tableView中删除一行(由FRC填充)时,应用程序不会崩溃或挂起。它没有做任何事情。删除按钮保持选中状态,如果我单击模拟器上的其他位置,删除按钮将取消选择并消失,但单元格永远不会从UI中删除。我确信我在这里有一个愚蠢的疏忽,但我无法发现它。以下是我的代码的相关部分。
我将UITableViewController接口声明为:
#import <UIKit/UIKit.h>
#import "RubricAppDelegate.h"
@interface ClassList : UITableViewController <NSFetchedResultsControllerDelegate> {
NSMutableArray *classList;
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property(nonatomic,retain) NSMutableArray *classList;
@property(nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property(nonatomic, retain) NSManagedObjectContext *managedObjectContext;
- (IBAction) grade:(id)sender;
@end
在其实施文件中,我有:
- (void)viewDidLoad {
[super viewDidLoad];
RubricAppDelegate *appDelegate = (RubricAppDelegate *)[[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"myClass" inManagedObjectContext:managedObjectContext];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"classID" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
NSError *error;
[fetchedResultsController performFetch:&error];
}
和
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
myClass *result = (myClass *)[fetchedResultsController objectAtIndexPath:indexPath];
[managedObjectContext deleteObject:result];
NSError *error;
[managedObjectContext save:&error];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
//Not yet implemented
}
}
和
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
另外
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == [[fetchedResultsController fetchedObjects] count]) {
return UITableViewCellEditingStyleInsert;
}
return UITableViewCellEditingStyleDelete;
}
上面的代码使得单元格在我的获取填充单元格之外的插入单元格,但其余的删除单元格。
我的UITableView连接到我的文件所有者,用于IB中的委托和数据源。我需要更改什么才能触发NSFetchedResultsChangeDelete:
?
我已将[managedObjectContext save:&error];
添加到commitEditingStyle
,并通过断点验证当我选择删除单元格时它被点击。我知道保存处理正确,因为如果我退出并重新运行应用程序,我选择删除的单元格实际上已被删除。
然而,当我按下删除按钮时,仍然没有发生任何事情。按钮保持选中状态,直到我点击其他位置,从而取消选择它。
答案 0 :(得分:2)
您能否展示构建NSFetchedResultsController
的代码?现在你已经在代码中保存了@DVG建议,那么你应该得到回调。也许你的代表没有正确设置。
我怀疑你没有在NSFetchedResultsController
上设置代表:
[fetchedResultsController setDelegate:self];
在您调用-performFetch:
的地方添加该行后,您应该开始接收更新。
答案 1 :(得分:1)
看起来您需要实现editingStyleForRowAtIndexPath以实际声明您尝试删除的单元格为可删除。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleDelete;
}
此外,您似乎没有保存您的managedObjectContext。
编辑: 所以听起来你的模型正在提交,但你的tableview正在重新加载。
尝试实施
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}