所以基本上我现在正在做的是通过选择它们并使用heightForRowAtIndexPath来改变它们的高度来扩展我的单元格,如果我再次选择它或选择一个不同的单元格,那些单元格将扩展或恢复到它们的正常大小。
但是,在单元格扩展时,我有一些额外的数据要在展开的部分中显示,更改单元格的背景颜色并设置我在tableviewcell子类中定义的一些其他属性。因此,当单元格处于其正常高度时,背景将为浅绿色。当它扩展时,它需要是白色的。我设置了我的tableviewcell子类属性(一个BOOL),这样当它再次循环遍历单元格时(cellforRowatindexpath)我可以根据需要更新这些属性。不幸的是,我还没能找到一种方法来获取在cellForRowAtIndexPath中选择的当前单元格。
以下是相关代码。请记住,我想跟踪当前选定的单元格和前一个单元格(如果与当前单元格不同),以便我可以更新两个单元格属性。一次只能扩展一个单元格。当选择并扩展当前单元格时,前一个单元格(如果适用)将收缩回正常高度。我的configureCell方法就是根据其BOOL属性分配属性。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier forIndexPath:indexPath];
[cell configureCell:self.item[indexPath.row] isCollapsed:cell.isCollapsed];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell *currentCell;
MyCustomCell *previousCell;
self.currentSelectedIndex = indexPath;
//assign previous and current if previous is nil
if(!self.previousSelectedIndex){
self.previousSelectedIndex = self.currentSelectedIndex;
currentCell = [tableView cellForRowAtIndexPath:self.currentSelectedIndex];
currentCell.isCollapsed = NO;
}
//we have tapped the same cell as before
else if(self.previousSelectedIndex == self.currentSelectedIndex){
previousCell = [tableView cellForRowAtIndexPath:self.previousSelectedIndex];
previousCell.isCollapsed = YES;
self.previousSelectedIndex = self.currentSelectedIndex = nil;
}
//if they aren't equal, then collapse the previous selected cell
//and expand the current selected cell
else{
previousCell = [tableView cellForRowAtIndexPath:self.previousSelectedIndex];
previousCell.isCollapsed = YES;
currentCell = [tableView cellForRowAtIndexPath:self.currentSelectedIndex];
currentCell.isCollapsed = NO;
self.previousSelectedIndex = self.currentSelectedIndex;
}
[tableView beginUpdates];
if(self.currentSelectedIndex){
[tableView reloadRowsAtIndexPaths:@[self.currentSelectedIndex, self.previousSelectedIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
}
[tableView endUpdates];
}
所以,显然我的当前和之前的单元格会在我们离开这个方法时被删除,因为它们是本地的,但我正在努力解决如何:
一个。重新加载会导致cellForRowAtIndexPath再次执行的单元格(这在尝试使用reloadRows时有效 - 但也许我做错了)
b.once cellForRowAtIndex开始遍历单元格如何捕获currentCell和previousCell,以便我可以更新其内容,如上所述。 [dequeueReusableCellWithIdentifier:myIdentifier]只是得到一个我不想要的新单元格。
细胞膨胀和收缩很好,这不是问题。