我有一个tableView中每个部分的自定义标题,headerView有一个按钮。单击该按钮,我尝试通过更改该部分的行数来扩展该部分。如果我调用reloadData它可以正常工作,但是当我尝试使用reloadSections / insert / delete部分时它会崩溃。
HEre是我的行数方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (highlighHeaderClicked) {
return [_expandCountArray[section]integerValue]; // 9,9,9
}
return [_collapseCountArray[section]integerValue]; //2,2,2
}
因此默认情况下tableView显示2行,单击按钮时,我想显示9行。
和按钮操作方法:
-(IBAction)highlightHeaderClicked:(id)sender{
highlighHeaderClicked = !highlighHeaderClicked;
NSIndexPath *indexPath = [self getIndexPathForView:sender];
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.length-1];
[self.tableView beginUpdates];
[self.tableView deleteSections:indexSet withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView insertSections:indexSet withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
}
通过这样做,我获得了这一点:
无效更新:第2节中的行数无效。更新后的现有部分中包含的行数(9)必须等于更新前该部分中包含的行数(2) ,加上或减去从该部分插入或删除的行数(插入0,删除0),加上或减去移入或移出该部分的行数(0移入,0移出)。
我还尝试在调用按钮操作方法时从数据源中删除对象。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [_tempRowCountArray[section]integerValue]; //2,2,2
}
-(IBAction)highlightHeaderClicked:(id)sender{
highlighHeaderClicked = !highlighHeaderClicked;
NSIndexPath *indexPath = [self getIndexPathForView:sender];
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.length-1];
NSInteger rowCount = _mainDataSet.dashboardArray.count;
if (rowCount > 2) {
if (highlighHeaderClicked) {
[_tempRowCountArray replaceObjectAtIndex:indexPath.length withObject:@(rowCount)];
}else{
[_tempRowCountArray replaceObjectAtIndex:indexPath.length withObject:@2];
}
[self.tableView beginUpdates];
[self.tableView deleteSections:indexSet withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView insertSections:indexSet withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
}
}
我在这里缺少什么?我想我每次都传递正确的数组。
答案 0 :(得分:1)
您遇到的基本问题是您尝试插入和删除整个部分。这意味着部分的数量必须改变。
相反,您必须删除并插入部分行。
此外,您必须指定先前状态和新状态之间的确切差异。
例如:
NSArray *rowsToBeAdded = ...
NSArray *rowsToBeRemoved = ...
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:rowsToBeAdded withRowAnimation: UITableViewRowAnimationBottom];
[self.tableView deleteRowsAtIndexPaths:rowsToBeRemoved withRowAnimation: UITableViewRowAnimationBottom];
[self.table endUpdates];
这也意味着你必须非常小心你的逻辑并跟踪扩展的部分。
您必须为折叠和展开的部分返回正确数量的项目:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
BOOL expanded = ...;
if (!expanded) {
return 0;
}
return ...
}
针对此问题的另一个解决方案是始终将行保持在那里并避免插入和放置。完全删除。您可以为所有隐藏的行返回零高度。
要更新所有行的高度,您只需调用:
[self.tableView beginUpdates];
[self.tableView endUpdates];