1

我花了几个小时寻找解决方案,但没有任何运气。我正在尝试以编程方式删除一行(也取消选择同一行)。在下面的行删除调用之后, UITableViewDelgate 方法被预期调用并且数据源被更新但 UITableView 没有被刷新。deselectRowAtIndexPath 调用也不起作用。我尝试了各种场景,如注释行所示。

这是我的代码: checkoutPerson 作为观察者监听 NSNotificationCenter 消息的结果被调用。

- (void) checkoutPerson: (NSNumber*) personId {
Person *person = [_people objectForKey:personId];
if( person )
{
    // Remove person from data source
    int rowIndex = person.rowIndex;
    S2Log(@"Deleting row number=%d", rowIndex);
    [_allKeys removeObjectAtIndex:rowIndex];
    [_people removeObjectForKey: personId];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];

    //[[self tableView] beginUpdates];
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    S2Log(@"Deleting indexPath row=%d", [indexPath row]);
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                    withRowAnimation:UITableViewRowAnimationFade];
    //[[self tableView] endUpdates];
    S2Log(@"Reloading data");
    //[[self tableView] reloadData];
    //[self performSelector:@selector(refreshView) withObject:nil afterDelay:1.5];
    //[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}

}

我将不胜感激。谢谢-维伦德拉

我相信删除的单元格没有被回收。如果我删除中间的行,最后一行总是被删除(因为少了一个项目),但删除的行仍然存在。

4

2 回答 2

0

我发现了问题。它与我上面发布的代码无关。它是视觉显示和数据源内容之间的同步问题。我有一个嵌入式 UITableView 作为复合视图的一部分。在复合视图的控制器中,我将 UITableView 的委托和数据源连接到 UITableViewController 的实例。而不是这个,我应该将 UITableViewController 的 tableView 属性设置为嵌入式 UITableView。似乎 UITableView 必须包含在 UITableViewController 中,以便正确地将表格视图视觉显示同步到数据源的内容。这也修复了行取消选择和滚动。我还需要延迟 reloadData 调用,在这种情况下不需要 deleteRowsAtIndexPaths:withRowAnimation。

感谢大家的大力帮助。

于 2013-07-23T16:28:11.907 回答
0

在两个函数之间使用上面的代码进行表格视图

[tableView beginUpdates];

// the deletion code from data source and UITableView

[tableView endUpdates];

通过调用此函数,您将告诉UITableView您即将进行更新以删除您的单元格。

编辑

我在您的代码中看到的另一个问题是您首先从数据源中删除数据。

现在您要的是UITableViewCell(实际上是重新加载UITableView),然后您要从中删除该行UITableView

我想您应该UITableViewCell在从数据源中删除值之前获取。

于 2013-07-22T21:27:39.713 回答