我的初创日期和我的UITableView的最终更新有些问题。我想使用这个函数来动画我的tableview,而不是使用我现在使用的reloadData。当我使用BeginUpdates并且抱怨这个时,它总是会出现问题:
'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 1. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
所以我的numberOfRowInSection存在问题:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
int returnInt;
if (section == 0) {
if ([self datePickerIsShown]){
returnInt = 3;
}else{
returnInt = 2;
}
}else if([[[[self theNewGame] _dobbelstenen] objectAtIndex:section - 1] diceSoort] == ENUMOgen){
returnInt = 1;
}else{
returnInt = [[[[[self theNewGame] _dobbelstenen] objectAtIndex:section - 1.0] optiesDobbelsteen] count] + 1.0;
}
return returnInt;
}
我这样称呼它:
if (indexPath.section == 0 && indexPath.row == 1) {
self.datePickerIsShown = ! self.datePickerIsShown;
[tableView beginUpdates];
[tableView endUpdates];
}
有什么问题?
亲切的问候
答案 0 :(得分:3)
您正在将表视图数据源中的行数从2更改为3。
if ([self datePickerIsShown]) {
returnInt = 3;
} else {
returnInt = 2;
}
您必须更新表视图,以便表视图和表视图数据源就行数达成一致。
if (indexPath.section == 0 && indexPath.row == 1) {
self.datePickerIsShown = ! self.datePickerIsShown;
[tableView beginUpdates];
if ([self datePickerIsShown])
[tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:2 inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
else
[tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:2 inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
}
注意:由于您只对表格视图进行了1次更改,因此您不需要开始和结束更新。您只需调用1插入或删除所需的内容即可。
if (indexPath.section == 0 && indexPath.row == 1) {
self.datePickerIsShown = ! self.datePickerIsShown;
if ([self datePickerIsShown])
[tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:2 inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
else
[tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:2 inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
}
答案 1 :(得分:2)
您必须告诉表格查看您更改的内容,以便知道如何制作动画。例如,如果您有2个项目并且插入了另一个项目,则表格视图只会知道您现在有3个项目。你需要告诉它你在哪里插入了这个项目。您可以通过在beginUpdates
和endUpdates
之间调用以下内容来执行此操作:
– insertRowsAtIndexPaths:withRowAnimation:
因此,例如,如果您在第1部分的末尾插入第三个项目,那么您的代码将如下所示:
NSIndexPath *insertedIndexPath = [NSIndexPath indexPathForRow:2 inSection:1];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[insertedIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
为其他类型的更新,删除,移动等提供了几个相关的API:
– deleteRowsAtIndexPaths:withRowAnimation:
– moveRowAtIndexPath:toIndexPath:
– insertSections:withRowAnimation:
– deleteSections:withRowAnimation:
– moveSection:toSection:
您可能还会发现我的TLIndexPathTools库很有用。它自动完成这些工作。