UITableViewRowAnimationBottom不适用于最后一行

时间:2010-12-22 19:29:52

标签: iphone objective-c ios uitableview

我在这里遇到了一个非常相似的问题:https://stackoverflow.com/questions/3160796/inserting-row-to-end-of-table-with-uitableviewrowanimationbottom-doesnt-animate,虽然没有给出答案。他的代码也和我的有点不同。

我有一个非常简单的例子,它是从导航应用程序模板构建的。

NSMutableArray *items;

- (void)viewDidLoad {
    [super viewDidLoad];
    items = [[NSMutableArray array] retain];
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addItem)] autorelease];
}

- (void)addItem{
    [items insertObject:@"new" atIndex:0];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return items.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text = [items objectAtIndex:indexPath.row];

    return cell;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [items removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom];
    }   
}

问题是,当我插入或删除表格中的最后一行时,动画根本不起作用;该行只是出现或立即消失。这只发生在UITableViewRowAnimationBottom上,但这是以这种方式创建或删除表格单元格最有意义的动画。这是Apple框架中的错误吗?或者它是故意这样做的吗?将额外的单元格添加到计数中是否有意义,然后设置此单元格以使其看起来根本不存在,只是为了解决这种行为?

2 个答案:

答案 0 :(得分:5)

也许,使用UITableViewRowAnimationBottom,新的单元格按原样添加,没有动画,下面的所有行都是滑动动画。因此,如果下面没有任何行,则不会有动画。

答案 1 :(得分:0)

我使用这样的东西来制作行(dis)外观,工作魅力

if (oldRowCount < rowCount)
{
    // insert
    NSMutableArray* indexPaths = [NSMutableArray array];
    while (oldRowCount < rowCount)
    {
        [indexPaths addObject: [NSIndexPath indexPathForRow: oldRowCount inSection: section]];
        oldRowCount = oldRowCount + 1;
    }
    [self.tableView insertRowsAtIndexPaths: indexPaths withRowAnimation: UITableViewRowAnimationTop];
}
else if (oldRowCount > rowCount)
{
    // remove
    NSMutableArray* indexPaths = [NSMutableArray array];
    while (rowCount < oldRowCount)
    {
        [indexPaths addObject: [NSIndexPath indexPathForRow: rowCount inSection: section]];
        rowCount = rowCount + 1;
    }
    [self.tableView deleteRowsAtIndexPaths: indexPaths withRowAnimation: UITableViewRowAnimationTop];
}