删除UITableView行 - 复制单元格

时间:2014-02-05 05:18:45

标签: ios iphone uitableview row-removal

尝试删除UITableView中的行时,我遇到了一些奇怪的行为。

我的应用中有两个tableview,它们在tableView:commitEditingStyle:forRowAtIndexPath:方法上的代码几乎相同。一个工作正常,另一个有这个问题:让我假设我的表视图上有超过X行,我不知道,所以单元重用和滚动都启用了。如果我删除列表顶部的一行,则在点击删除按钮之前,屏幕底部显示的单元格将被底部单元格全部复制。因此,如果我删除5行,例如,我的tableview上将有相同的单元格。然后,如果我滚动桌面视图,它们将全部恢复正常。 (或者,如果我更改了viewcontroller,然后返回到tableview的那个)

以下是工作表视图的代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
    if (search.text.length == 0) {
        [tableArray removeObjectAtIndex:indexPath.row];
        [goalTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self setBG];
        tempArray = [NSArray arrayWithArray:tableArray];
        [[NSUserDefaults standardUserDefaults]setObject:tempArray forKey:@"currentArray"];
        totalGoals = [[NSUserDefaults standardUserDefaults] integerForKey:@"totalGoals"];
        totalGoals = totalGoals - 1;
        [[NSUserDefaults standardUserDefaults] setInteger:totalGoals forKey:@"totalGoals"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    } } }

以下是有缺陷的tableview的代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
    if (search.text.length == 0) {
        [tableArray removeObjectAtIndex:indexPath.row];
        [goalTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self setBG];
        tempArray = [NSArray arrayWithArray:tableArray];
        [[NSUserDefaults standardUserDefaults]setObject:tempArray forKey:@"completedArray"];
        completedGoals = [[NSUserDefaults standardUserDefaults] integerForKey:@"completedGoals"];
        completedGoals = completedGoals - 1;
        [[NSUserDefaults standardUserDefaults] setInteger:completedGoals forKey:@"completedGoals"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    } } }

嗯,它几乎一样,所以我有点迷失在这里 - 他们有相同的代码,一个工作正常,另一个不是。这可能是cellForRowAtIndexPath:方法的问题吗?我想知道,但是这个方法一无所获,加上它们实际上也是一样的。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString * identifier = @"Cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell==nil) { 
        //here I'm setting up the cells, labels, and stuff.
    }

    if (search.text.length == 0 && [filteredArray count] == 0) {
        NSDictionary * dict = [tableArray objectAtIndex:[tableArray count] - 1 - indexPath.row];
        //here I use the values on the dict to do some stuff with labels, etc.
    }
    return cell;
}

问题是,我用这一行“掠过”数组:

NSDictionary * dict = [tableArray objectAtIndex:[tableArray count] - 1 - indexPath.row];

如果我不这样做,即当我只做[tableArray objectAtIndex:indexPath.row]这样的事情时,删除问题根本不会发生!这是反转阵列发生的原因。 哦,就是说,当我填充单元格时(例如,当视图加载时),单元格重用工作正常,没有重复的单元格或类似的东西。只有在删除行时才会发生这种情况。

1 个答案:

答案 0 :(得分:0)

检查两个表的cellforRowAtIndexPath:。 你重复使用细胞的方式应​​该有所不同。

在iOS6中,您无需像我在下面所做的那样检查if(cell == nil)

static NSString *CellIdentifier = @"Cell";    
CustomCell *cell = (CustomCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

您可以做的其他事情是在删除后尝试重新加载表。希望这能解决您的问题