删除一行UITableView时,iPhone-App崩溃

时间:2011-06-02 22:47:48

标签: iphone uitableview

我有一个UITableView,它使用单例对象作为数据源。

我已经实现了以下方法,允许用户删除UITableView中的行。但是,当我单击删除按钮时,应用程序崩溃并出现异常

方法:

-(void)viewDidLoad
{

some initialization code-----

UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:@"Delete"                                                        style:UIBarButtonItemStyleBordered                                                                 target:self                                                     action:@selector(toggleEdit:)];
       self.navigationItem.rightBarButtonItem = editButton;
       [editButton release];

}

-(IBAction)toggleEdit:(id)sender
{
    [self.myOrderTable setEditing:!self.myOrderTable.editing animated:YES];

    if(self.myOrderTable.editing)
        [self.navigationItem.rightBarButtonItem setTitle:@"Done"];
    else 
    {
     [self.navigationItem.rightBarButtonItem setTitle:@"Delete"];
    }

}

-(void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath
{
    NSUInteger row = [indexPath row];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];

}

但是当我尝试点击删除按钮时,我收到以下异常:

  

断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-1448.89 / UITableView.m:995

     

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第1节中的行数无效。更新后的现有部分中包含的行数(1)必须等于行数在更新(1)之前包含在该部分中,加上或减去从该部分插入或删除的行数(插入0,删除1)。'

*** Call stack at first throw:
(
    0   CoreFoundation                      0x010305a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01184313 objc_exception_throw + 44
    2   CoreFoundation                      0x00fe8ef8 
+[NSException raise:format:arguments:] + 136
    3   Foundation                          0x001153bb -
[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x00398e8b -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 8420
    5   UIKit                               0x00387cf8 -
[UITableView deleteRowsAtIndexPaths:withRowAnimation:] + 56
    6   Restaurant                          0x000117f9 -
[MyOrderViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 114
    7   UIKit                               0x00385037 -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 101
    8   UIKit                               0x0031a4fd -[UIApplication sendAction:to:from:forEvent:] + 119
    9   UIKit                               0x003aa799 -[UIControl sendAction:to:forEvent:] + 67
    10  UIKit                               0x003acc2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
    11  UIKit                               0x003ab7d8 -[UIControl touchesEnded:withEvent:] + 458
.............

..........
.............
)
terminate called after throwing an instance of 'NSException'

我可以在哪里开始解决这个问题?

3 个答案:

答案 0 :(得分:4)

“更新(1)后现有部分中包含的行数必须等于更新前该部分中包含的行数(1),加上或减去插入的行数或从该部分删除(0已插入,1已删除)。'“

错误清楚地说明了什么是错的。我会检查你的numberOfRowsInSection方法。您需要考虑要删除的行。您不能总是返回相同数量的行。如果要从表中删除一行,则numberOfRowsInSection需要返回旧的返回值减去1。

例如:

假设我使用一个字符串数组来填充tableview;

我的numberOfRowsInSection方法将使用

return [array count];

我的cellForRowAtIndexPath方法将使用

cell.textLabel.text = (NSString*)[array objectAtIndex:indexPath.row];

当我从tableView中删除一行(比如第3行)时,我也会从数组中删除该对象:

[array removeObjectAtIndex:3];

这样,当再次调用numberOfRowsInSection时,数组是一个较小的对象,numberOfRowsInSection返回一个比之前少的数字,它代表已删除的行。

答案 1 :(得分:2)

您是否阅读了错误消息?它说:

  

原因:'无效更新:第1部分中的行数无效。

所以...... tableView中的行数现在是错误的。为什么呢?

  

更新(1)后现有部分中包含的行数必须等于更新(1)之前该部分中包含的行数,加上或减去从该部分插入或删除的行数(0已插入,1已删除)。

从tableView中删除行时,还必须从tableView中显示的对象数组中删除相应的对象。你没有这样做。因此,UITableView引发了异常。

答案 2 :(得分:1)

您是否在commitEditingStyle中从数据源中删除了一个项目?如果表数据源有2个项并且您在commitEditingStyle中删除了一行:您还应该从数据源中删除一个项目,以便现在tableview和数据源都有1个元素。