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
}
}
}
尝试用[的tableView beginUpdates] [的tableView endUpdates]包装您的插入通话。从文档:
如果不进行插入,删除,并选择调用 此块中,表属性,如行计数可能成为 无效。
[tableView beginUpdates];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];
我有同样的问题。从我所知道的情况来看,如果UITableView认为被更改的单元格是可见的,它只会调用cellForRowAtIndexPath。既然你正在添加一个新的单元格,我猜这个表格不认为它是可见的,因此不会调用这个方法。 Jaminguys解决方案适用于我,但它听起来有点像UIKit中的错误。
如果您顺便插入表格视图中间的单元格,此方法可行。
尝试向'super'发送一个呼叫,看看会发生什么。您可能会无意中绕过某些父类功能。 – Hyperbole
如果我调用[super tableView:tableView commitEditingStyle:editingStyle forRowAtIndexPath:indexPath],我得到一个异常。或者我误解了你? – strave