【问题标题】:Animate data refresh (soft delete) on Core Data / UITableViewCore Data / UITableView 上的动画数据刷新(软删除)
【发布时间】:2011-08-19 20:12:58
【问题描述】:

我有一个由 fetchedResultsController 支持的表视图。在我的表格单元格上,我有一个执行软删除的按钮,就视图而言......点击按钮,执行软删除的选择器被调用,并且......应该发生一些事情(我'我尝试了很多东西),但我没有尝试过像 Apple 的行动画这样的动画。

我可以执行简单的行动画,比如让它滑开(这会留下一个空白行,直到我告诉表格重新加载,这反过来又有点不和谐)。这是我最近的一次:

 -(void) completeTask: (id) sender {
     NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];

     NSDate *date = [[NSDate alloc] init];
     NSManagedObject *task = [self.fetchedResultsController objectAtIndexPath:indexPath];

     [task setValue:date forKey:@"complete"];

     AppController *ac = [AppController sharedAppController];
     NSManagedObjectContext *moc = [ac managedObjectContext];

     NSError *error = nil;
     if(![moc save:&error]){
         NSLog(@"%@ %@",error, [错误描述]);
         退出(-1);
     } 别的 {
         UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

         CGRect cellFrame = cell.frame;
         [UIView beginAnimations:nil context:nil];
         [UIView setAnimationDuration:0.35];
         [UIView setAnimationDelegate:self];
         [UIView setAnimationDidStopSelector:@selector(someAnimationDidStop:finished:context:)];
         cell.frame = CGRectMake(cellFrame.size.width, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height);
         [UIView 提交动画];
     }
 }

-(void) someAnimationDidStop:(NSString *)animationID
                    完成:(布尔)完成上下文:(无效*)持续时间{
    NSLog(@"动画停止");
    [自取结果]; // 这家伙执行新的 fetch 和表数据重新加载
}

我觉得我走在了正确的轨道上,但我认为这并不是真正的答案。我希望以某种方式controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 会是答案。我的猜测是,如果我想要 Apple 动画,我将不得不创建一个单独的 NSMutableArray 来跟踪结果并确保它保持同步。

想法和意见?

谢谢!!!

【问题讨论】:

    标签: ios uitableview core-data animation


    【解决方案1】:

    我猜你已经有一个NSFetchedResultsController 的谓词,它不会获取那些“软删除”的对象。

    所以理论上你所要做的就是实现所有NSFetchResultsControllerDelegate方法。文档中的示例实现可以正常工作。
    不要忘记设置delegateNSFetchedResultsController

    然后,无需手动管理单元格,只需更改对象中的“软删除”值即可。 NSFetchResultsController 将监视上下文,它发现此更改使对象从集合中消失,因此它将从 tableView 中删除单元格。

    【讨论】:

    • 你是对的 - 在对我的委托方法进行了一些更改以正确启用真正的删除之后,我在下面的答案似乎停止工作,直到我删除了手动表管理。谢谢!
    【解决方案2】:

    编辑:@fluchtpunkt 的答案是正确的。在对我的代码进行了几次更新后,我的解决方案再次崩溃。删除重新获取 FRC 的块使其再次工作。


    我很惊讶我昨天在所有的迭代测试(学习)中都没有弄清楚这一点。我在以一种很好的方式将核心数据获取的结果与表格视图同步时遇到了问题 - 通常我会得到不匹配的索引(等等等等,行数(#)必须等于数字#加或减去行数等等等等(0 插入:# 删除).. 等等)。

    我的步骤如下:

    1. 执行软删除和保存
    2. 将获取的结果控制器设置为零self.fetchedrResultsController = nil
    3. 重新提取
    4. THEN 从表中删除该行:
     self.fetchedResultsController = nil;
             NSError *error = nil;
             if (![[self fetchedResultsController] performFetch:&error]) {
                 NSLog(@"未解决的错误 %@, %@", error, [error userInfo]);
                 中止();
             } 别的 {
                 [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
             }
    

    我真的不知道为什么我没有早点弄清楚这一点,但这很有意义。新鲜的眼睛?

    这是全图:

    -(无效)完成任务:(id)发件人{ NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; NSManagedObject *task = [self.fetchedResultsController objectAtIndexPath:indexPath]; [task setValue:date forKey:@"complete"]; AppController *ac = [AppController sharedAppController]; NSManagedObjectContext *moc = [ac managedObjectContext]; NSError *error = nil; if(![moc save:&error]){ NSLog(@"呃哦 - 无法保存删除!%@ \n%@",error, [错误描述]); 退出(-1); } 别的 { // 保存成功;重新获取数据(后台) self.fetchedResultsController = nil; NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"未解决的错误 %@, %@", error, [error userInfo]); 中止(); } 别的 { //用行动画更新表格视图 [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; } } }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多