我有一个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'
我可以在哪里开始解决这个问题?
答案 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个元素。