从uitableview cellForRowAtIndexPath委托中删除行时,应用程序崩溃

时间:2015-06-04 02:10:30

标签: ios uitableview uiviewanimation

我有一个表视图。我正在实现一个功能,其中单元格将开始衰落(在30秒内持续减少alpha)。完成30秒后,调用视图动画的完成处理程序以从数据源永久删除行(数组)。所有东西都在cellForRowAtIndexPath委托方法中。 我的问题是在更新前和更新后的数组计数之间保持同步。

代码:

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

    static NSString *postCellId = @"postCell";
    UITableViewCell *cell = nil;

    NSUInteger row = [indexPath row];
    cell = [tableView dequeueReusableCellWithIdentifier:postCellId];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleSubtitle
             reuseIdentifier:postCellId] autorelease];
    }

    Post *currentPost = [posts objectAtIndex:row];
    cell.textLabel.text = [currentPost postTitle];
    cell.textLabel.font = [UIFont systemFontOfSize:14];

    cell.detailTextLabel.text = [currentPost postDescr];
    cell.detailTextLabel.font = [UIFont systemFontOfSize:10];

    NSTimeInterval duration = 30;
    [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
                 animations:^ {
         cell.contentView.alpha = 0;
    } completion:^(BOOL finished) {
        [self.tableView beginUpdates];
        NSLog(@"delete index >> %d from array >> %@", row, posts);
        [posts removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates];
    }];

    return cell;
}

日志:

  

2015-06-04 07:22:05.764 Feeder [1177:60b]删除索引>>数组0

     
    
      

(           “”           “”           “”           “”           “”)2015-06-04 07:22:05.766 Feeder [1177:60b]删除索引>> 1来自数组>> (           “”           “”           “”           “”)2015-06-04 07:22:05.767 Feeder [1177:60b]删除索引>> 2来自数组>> (           “”           “”           “”)2015-06-04 07:22:05.768 Feeder [1177:60b] 删除索引>> 3来自数组>> (           “”           “”)

    
  

如果您看到上次日志,则会出现崩溃问题。

崩溃日志:

  

2015-06-04 07:22:05.770 Feeder [1177:60b] *终止应用程序   未捕获的异常'NSRangeException',原因:'* - [__ NSArrayM   removeObjectAtIndex:]:索引3超出边界[0 .. 1]'

如何解决它。

2 个答案:

答案 0 :(得分:2)

您的错误是您将旧的indexPath保留在块中,而不是更新它。

例如: 如果数组中有2条记录,则完整块中的操作为

  1. 删除第0行
  2. 删除第1行
  3. 但是,如果删除第一个单元格(第0行),则第1行indexPath.row将更新为0.但是您要删除1。

    所以,我认为你可以动态获取indexPath,然后删除

    [self.tableView beginUpdates];
    NSIndexPath *path = [tableView indexPathForCell:cell];
    NSLog(@"delete index >> %d from array >> %@", path.row, posts);
    [posts removeObjectAtIndex:path.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
    

    我不确定这是否有效,只需尝试。

答案 1 :(得分:2)

你可以试试这个:

[self.tableView beginUpdates];
NSInteger postIndex = [posts indexOfObject:currentPost];
NSIndexPath *path = [NSIndexPath indexPathForRow:postIndex inSection:0];
NSLog(@"delete index >> %d from array >> %@", path.row, posts);
[posts removeObject:currentPost];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];