我有一个带有编辑按钮的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
}
}
}
答案 0 :(得分:2)
尝试使用[tableView beginUpdates] [tableView endUpdates]包装插入调用。来自文档:
如果您不进行插入,删除和选择调用 在此块中,行计数等表属性可能会变为 无效。
[tableView beginUpdates];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];
答案 1 :(得分:1)
我遇到同样的问题。据我所知,如果UITableView认为正在更改的单元格是可见的,则它只调用cellForRowAtIndexPath。由于您要添加一个新单元格,我猜测该表格并不认为它是可见的,因此不会调用该方法。 Jaminguys解决方案适合我,但听起来有点像UIKit中的错误。
如果要在表格视图的中间插入单元格,此方法可以正常工作。