我正在使用CoreData + UITableView处理todo列表应用程序,我想隐藏用户标记为已完成的行。
我的当前解决方案是在用户标记任务完成时调用deleteRowsAtIndexPaths并从numberOfRowsInSection函数中扣除已删除的行。
-(void)markDone:(NSIndexPath *) _indexPath{
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:_indexPath] withRowAnimation:UITableViewRowAnimationFade];
deletedCount = deletedCount + 1;
[self.tableView endUpdates];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
if (deletedCount>0) {
return [sectionInfo numberOfObjects]-deletedCount;
}
return [sectionInfo numberOfObjects];
}
虽然这种方法确实有效,但我确实需要一些代码黑客攻击。有没有办法调用NSFetchedResultsController didChangeObject来改变特定字段的状态?
由于
答案 0 :(得分:1)
我认为有很多方法可以解决这个问题。我只是在您的托管对象中添加一个字段,表明是否隐藏了一行“
删除将相应地设置此字段。
现在需要的是一个NSFetchRequest,它带有相应的谓词来过滤隐藏的行。
我刚刚创建了一个支持核心数据的简单模板应用程序,我认为它很容易实现:
我将一个隐藏的BOOL属性添加到了一个赋予的权限,默认为NO。
然后我将此代码添加到didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
[selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"hidden"];
}
在- (NSFetchedResultsController *)fetchedResultsController {...
我添加了
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hidden == NO"];
[fetchRequest setPredicate:predicate];
之后
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
这是通过单击(仅针对此示例)来隐藏单元格。