tableView的insertRowsAtIndexPath不会调用tableView的cellForRowAtIndexPath

时间:2011-08-31 15:14:52

标签: iphone objective-c ipad uitableview

我有一个带有编辑按钮的UITableViewController。单击此按钮时,用户可以删除或添加行到UITableView。删除行工作正常。但是当我想添加一个新行时,我得到一个来自左侧的空单元格的简短动画,当动画结束时,表格视图看起来与调用方法之前的外观完全一致。当我添加一个新单元格时,我将一个新对象添加到数据数组中,该数组向表格视图提供,然后添加单元格。该数据阵列得到更新。因此,如果我在添加新单元格后调用[tableView reloadData],我会看到新单元格,但没有任何动画。我真的很想拍摄动画。

我有同样事情的工作示例。我意识到在调用tableView:commitEditingStyle:forRowAtIndexPath:之后,会自动调用表视图的数据源方法tableView:cellForRowAtIndexPath:。就我而言,它没有。我猜这就是为什么我没有看到新细胞的原因。任何想法为什么会发生这种情况?

这是我的`tableView:commitEditingStyle:forRowAtIndexPath:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
        // Delete the row from the data source
        [self.tableData removeObjectAtIndex:[indexPath row]];

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:self.tableData forKey:self.key];
        [defaults synchronize];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
        UITextField *textField = (UITextField *)[[cell contentView] viewWithTag:kTextFieldTag];
        NSString *textFieldText = [textField text];
        if (textFieldText != nil) 
        {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
            NSString *string = [[NSString alloc] initWithString:textFieldText];
            [self.tableData addObject:string];
            [string release];

            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:self.tableData forKey:self.key];
            [defaults synchronize];

            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];   

            // If reloadData is being called, the new cell is displayed but without the animation
            // [tableView reloadData]; 
        } 
        else
        {
            // Display alert view
            // Code for displaying an AlertView
        }
    }   
}

2 个答案:

答案 0 :(得分:2)

尝试使用[tableView beginUpdates] [tableView endUpdates]包装插入调用。来自文档:

  

如果您不进行插入,删除和选择调用   在此块中,行计数等表属性可能会变为   无效。

[tableView beginUpdates];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];

答案 1 :(得分:1)

我遇到同样的问题。据我所知,如果UITableView认为正在更改的单元格是可见的,则它只调用cellForRowAtIndexPath。由于您要添加一个新单元格,我猜测该表格并不认为它是可见的,因此不会调用该方法。 Jaminguys解决方案适合我,但听起来有点像UIKit中的错误。

如果要在表格视图的中间插入单元格,此方法可以正常工作。