除非调用reloadData,否则编辑模式下的UITableView不会显示插入,这会杀死动画

时间:2012-08-31 02:44:12

标签: ios uitableview setediting

我有一个带有三个部分的UITableView,第二部分有一个表格,它在编辑模式下显示插入和删除指示符。我在cellForRowAtIndexPath中为插入行添加了一个单元格:编辑为YES时。此外,当表格进入编辑模式时,我减少了部分的数量,因此第三部分没有显示(它在编辑模式下有一个我要隐藏的按钮)。除非我在setEditing中调用[self.tableView reloadData],否则我看不到插入行,但是当我调用它时没有动画。我做错了什么?

- (void)setEditing:(BOOL)flag animated:(BOOL)animated

{
  [super setEditing:flag animated:YES];
  [self.tableView setEditing:flag animated:YES];
  //unless i add [self.tableView reloadData] i don't see the + row, but then there is no animation
  [self.tableView reloadData];

确定我正在执行此操作的部分数量

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.editing ? 2 : 3;
}

要添加插入行,我在cellForRowAtIndexPath

中执行此操作
 if (indexPath.row == [[[self recipe] tasks] count])
 {
    cell.textLabel.text = @"Add task...";
    cell.detailTextLabel.text = @"";

任何帮助非常感谢。我很尴尬地说我浪费了多少时间!

2 个答案:

答案 0 :(得分:2)

您需要使用UITableView的更新方法。有关详细信息,请查看Apple关于该主题的comprehensive guide,但此代码段应该会给您一个想法。请注意,当表视图离开编辑模式时,您应该执行相反的操作。

NSIndexPath *pathToAdd = [NSIndexPath indexPathForRow:self.recipe.tasks.count section:SECTION_NEEDING_ONE_MORE_ROW];
NSIndexSet *sectionsToDelete = [NSIndexSet indexSetWithIndex:SECTION_TO_DELETE];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[ pathToAdd ] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView deleteSections:sectionsToDelete withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];

答案 1 :(得分:0)

非常感谢,卡尔。完善。我曾多次阅读Apple文档,但却没有得到它。一个谷歌的例子让我走错了路。问题解决了,它看起来非常好。 :)

NSIndexPath *pathToAdd = [NSIndexPath indexPathForRow:self.recipe.tasks.count section:1];
NSIndexSet *sectionsToDelete = [NSIndexSet indexSetWithIndex:2];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[ pathToAdd ] withRowAnimation:UITableViewRowAnimationAutomatic];
// update the datasource to reflect insertion and number of sections
// I added a 'row' to my datasource for "Add task..."
// which is removed during setEditing:NO
[self.tableView deleteSections:sectionsToDelete withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];

托德