tableView的insertRowsAtIndexPath不会调用tableView的cellForRowAtIndexPath

问题描述:

我有一个带编辑按钮的UITableViewController。点击时,用户可以删除或添加行到UITableView。删除行可以正常工作。但是当我想添加一个新行时,我会从左边看到一个空白单元格的动画,当动画结束时,表格视图看起来与调用该方法之前的样子完全相同。当我添加一个新的单元格时,我将一个新的对象添加到提供我的表格视图的数据数组中,然后添加单元格。该数据数组得到更新。所以如果我在添加新单元格后调用[tableView reloadData],我会看到新的单元格,但没有任何动画。我真的很想拥有动画。tableView的insertRowsAtIndexPath不会调用tableView的cellForRowAtIndexPath

我有一个同样的事情的工作示例。我意识到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 
     } 
    } 
} 
+0

尝试向'super'发送一个呼叫,看看会发生什么。您可能会无意中绕过某些父类功能。 – Hyperbole

+0

如果我调用[super tableView:tableView commitEditingStyle:editingStyle forRowAtIndexPath:indexPath],我得到一个异常。或者我误解了你? – strave

尝试用[的tableView beginUpdates] [的tableView endUpdates]包装您的插入通话。从文档:

如果不进行插入,删除,并选择调用 此块中,表属性,如行计数可能成为 无效。

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

感谢您的回答。这听起来很有希望,但它没有改变任何东西。 – strave

+0

您是否在endUpdates之后尝试取消注释reloadData调用? – jaminguy

+1

但我注意到,如果我在发布的代码之后执行[tableView reloadData],那么我会得到某种动画。动画有点不同(可能更短),但比没有好。 – strave

我有同样的问题。从我所知道的情况来看,如果UITableView认为被更改的单元格是可见的,它只会调用cellForRowAtIndexPath。既然你正在添加一个新的单元格,我猜这个表格不认为它是可见的,因此不会调用这个方法。 Jaminguys解决方案适用于我,但它听起来有点像UIKit中的错误。

如果您顺便插入表格视图中间的单元格,此方法可行。