我知道有一个名为[tableView cellForRowAtIndexPath:indexPath];
的方法,我们可以使用它来获取给定indexPath的单元格。但是我想在行敲击时展开行。使用此代码 -
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Deselect cell
[tableView deselectRowAtIndexPath:indexPath animated:TRUE];
// Toggle 'selected' state
BOOL isSelected = ![self cellIsSelected:indexPath];
// Store cell 'selected' state keyed on indexPath
NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected];
int sec = indexPath.section;
int row = indexPath.row;
NSString* indexpathStr = [NSString stringWithFormat:@"%d-%d", sec, row];
[selectedIndexes setObject:selectedIndex forKey:indexpathStr];
// This is where magic happens...
[tableView beginUpdates];
[tableView endUpdates];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat height = 0.0;
if([self cellIsSelected:indexPath]) {
//problem here
CalEventCell* cell = (CalEventCell*)[tableView cellForRowAtIndexPath:indexPath];
[self setDescriptionFrame:cell.descriptionLbl];
height = cell.descriptionLbl.frame.size.height+cell.eventLbl.frame.size.height +20;
}
else
height = 60;
return height;
}
当一行点击我在tableview上调用beginUpdates
和endUpdates
方法并在heightForAtIndexPath方法中更改行高。问题是,你可以看到我从{{1}调用cellForAtIndexPath
在cellForRow中有heightForAtIndexPath
方法调用,它变成对heightForRow的调用,这个循环永远不会结束,程序会因beginUpdates
而崩溃。
那么从indexPath或任何其他方式获取单元格的任何其他方法呢?任何帮助将不胜感激。
答案 0 :(得分:3)
查看以下代码。
// Add a mutable array to your class
NSMutableArray *selectedCellArray;
// Initialise it in `viewDidLoad`
-(void)viewDidLoad
{
[super viewDidLoad];
selectedCellArray = [[NSMutableArray alloc] init];
}
// Add selected indices in selectedCellArray
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Deselect cell
[tableView deselectRowAtIndexPath:indexPath animated:TRUE];
[tableView reloadData];
if (![selectedCellArray containsObject:indexPath])
[selectedCellArray addObject:indexPath];
else
[selectedCellArray removeObject:indexPath];
[tableView beginUpdates]; // Animate the height change
[tableView endUpdates];
}
// Write the UI Updation in HeightForRowAtIndexPath Method
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat height = 0.0;
if (selectedCellArray.count>0) {
if ([selectedCellArray containsObject:indexPath]) {
CalEventCell* cell = (CalEventCell*)[tableView cellForRowAtIndexPath:indexPath];
[self setDescriptionFrame:cell.descriptionLbl];
height = cell.descriptionLbl.frame.size.height+cell.eventLbl.frame.size.height+20;
return height;
}else{
height = 60.f;
return height;
}
}
return height;
}
希望这有助于
答案 1 :(得分:2)
您应该在 didSelectRowAtIndexPath 方法上调用以下代码行
[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:sec]] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
当重新加载行时cellForRowAtIndexPath:indexPath
和heightForRowAtIndexPath
方法将被调用,你可以扩展单元格的高度
答案 2 :(得分:0)
如果您使用可重复使用的单元格,则无法在cellForRowAtIndexPath
中使用heightForRowAtIndexPath
。您需要以其他方式计算高度。可能对您有用的最简单方法是在您的类中保留原型单元格,仅用于调整大小。
答案 3 :(得分:0)
试试这个:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[your_tableView reloadData];
}