我目前正在为iPhone编写一个简单的表视图示例,但对于我的生活,我无法弄清楚为什么会发生以下异常。
工作流程如下: 我有一个UIViewController我要添加一个UIView。那个视图然后我添加了一个以编程方式定义的UITableView
- (id)init{
[super initWithNibName:nil bundle:nil];
tableView = [[UITableView alloc] initWithFrame:CGRectMake(20, 180, 280, 180) style:UITableViewStyleGrouped];
tableView.backgroundColor = [UIColor redColor];
tableView.delegate = self;
return self;
}
一旦完成,我使用UITableViewDelegate并覆盖以下方法,这将导致我的表被编辑。这是由按钮和
的选择器方法触发的- (void)editList:(id)sender{
[self setEditing:YES animated:YES];
[editButton addTarget:self action:@selector(doneList:) forControlEvents:UIControlEventTouchUpInside];
[editButton setBackgroundImage:[UIImage imageNamed:@"ApplyChanges.png"] forState:UIControlStateNormal];
}
还有另一个名为doneList的方法,它在完成时被触发,但代码没有那么远。因此,一旦单击该按钮,就会调用setEditing的委托并抛出错误。
这是委托方法
- (void)setEditing:(BOOL)flag animated:(BOOL)animated {
NSLog(@"setEditing");
// Always call super implementation of this method, it needs to do some work
[super setEditing:flag animated:animated];
// We need to insert/remove a new row in to table view to say "Add New Item..."
if (flag) {
// If entering edit mode, we add another row to our table view
int count = entries.count;
NSLog(@"int: %i", count);
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:count inSection:0];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
} else {
// If leaving edit mode, we remove last row from table view
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[entries count] inSection:0];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
}
}
执行期间有关此代码块的大量事情: 1)最初“entries”数组为空,因此计数为0,这似乎返回一个非空的indexPath对象 2)当条目填充了伪造数据时,计数正确增加但仍然出现错误 3)我已经尝试删除超级setEditing调用并且仍然出现错误
最后这是错误。
2011-01-12 16:46:13.623 Book[6256:40b] numberOfRowsInSection
2011-01-12 16:46:13.625 Book[6256:40b] numberOfRowsInSection
2011-01-12 16:46:17.658 Book[6256:40b] setEditing
2011-01-12 16:46:17.659 Book[6256:40b] int: 0
2011-01-12 16:46:17.660 Book[6256:40b] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UITableView.m:976
2011-01-12 16:46:17.692 Book[6256:40b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted).'
请告诉我,如果有一些明显我遗漏的东西,是否可能需要包含另一种我不知道的委托方法?
答案 0 :(得分:0)
好的想出来了。看来,当使用设置UITableViewDelegate的自定义UIViewController时,您还需要设置UITableViewDataSource并将tableViews dataSource指向self。
示例代码。
旧代码
// Header File
@interface MyViewController : UIViewController <UITableViewDelegate> {
}
// Main File
- (id)init{
[super initWithNibName:nil bundle:nil];
tableView = [[UITableView alloc] initWithFrame:CGRectMake(20, 180, 280, 180) style:UITableViewStyleGrouped];
tableView.backgroundColor = [UIColor redColor];
tableView.delegate = self;
return self;
}
更新了工作代码
// Header File
@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
}
// Main File
- (id)init{
[super initWithNibName:nil bundle:nil];
tableView = [[UITableView alloc] initWithFrame:CGRectMake(20, 180, 280, 180) style:UITableViewStyleGrouped];
tableView.backgroundColor = [UIColor redColor];
tableView.delegate = self;
tableView.dataSource = self;
return self;
}