核心数据:删除记录时自动选择下一个表格行

时间:2011-08-27 02:30:07

标签: objective-c ios core-data uisplitviewcontroller detailsview

我正在使用拆分视图控制器开发核心数据驱动的iPad应用程序。想象一下iPad Mail应用程序,你就会走上正轨。当我在Root View Controller中选择一条记录时,DetailViewController中会显示详细信息。

在详情视图中,我有一个删除按钮。单击时,它会告知其Core Data上下文删除当前对象。它正确执行删除,并且行应该从RootViewController中消失。

如何让RootViewController在删除的行之后自动选择行,以便随后在详细视图中显示详细信息? (如果删除的行是最后一行,还是自动选择上一行?)

2 个答案:

答案 0 :(得分:0)

如果您使用NSFetchedResultsController来管理表格,那么您可以使用它的委托方法来响应更改。

使用controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:委托方法并检查NSFetchedResultsChangeDelete更改类型。

您可以查看indexPath是否与表格中当前选定的行匹配,然后对其采取行动。

答案 1 :(得分:0)

行。我想我明白了。这就是我做的。 (如果你看到更好的方法,请发信息。)

首先,我定义了一个新的NSInteger ivar,lastSelectedRow。

接下来,我改变了

   case NSFetchedResultsChangeDelete: {
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
       break;

   case NSFetchedResultsChangeDelete: {
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
       lastSelectedRow = indexPath.row;
       id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
       if (lastSelectedRow == [sectionInfo numberOfObjects]) {
           --lastSelectedRow;
       }
       break;
   }

然后我改变了

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
    if (lastSelectedRow > -1) {
        NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:lastSelectedRow inSection:0];
        [self.tableView selectRowAtIndexPath:newIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
        [self tableView:self.tableView didSelectRowAtIndexPath:newIndexPath];
        lastSelectedRow = -1;
    }
}

Und voila !!

作为额外的奖励,我现在可以在我的应用程序终止时存储最后选择的行,并且我可以在下次启动时立即返回它。

相关问题