隐藏特定的UITableViewCell行

时间:2011-05-05 16:32:34

标签: iphone objective-c cocoa-touch core-data

我正在使用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来改变特定字段的状态?

由于

1 个答案:

答案 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];

这是通过单击(仅针对此示例)来隐藏单元格。