У меня есть пример проекта здесь:
http://dl.dropbox.com/u/7834263/ExpandingCells.zip
В этом проекте UITableView имеет пользовательский UITableViewCell.В каждой ячейке есть 3 UIViews, содержащие метку.
Цель состоит в том, чтобы развернуть ячейку при касании, а затем свернуть ее при повторном касании.Сама ячейка должна изменить свою высоту, чтобы выставить подпредставления.Вставка или удаление строк недопустимы.
Демонстрационный проект работает почти так, как ожидается.На самом деле в iOS 4.3 все работает отлично.Однако в iOS 5, когда строки разрушаются, предыдущие ячейки волшебным образом исчезают.
Чтобы заново создать проблему, запустите проект в симуляторе или устройстве с iOS 5 и коснитесь первой ячейки, чтобы развернуть ее.Затем снова нажмите на ячейку, чтобы свернуть ее.Наконец, коснитесь клетки прямо под ней.Предыдущий исчезает.
Продолжение постукивания по каждой ячейке в разделе приведет к исчезновению всех ячеек, в которых отсутствует весь раздел.
Я также попытался использовать reloadData вместотекущей настройки, но это разрушает анимацию и все равно выглядит как хак.reloadRowsAtIndexPaths должен работать, но вопрос в том, почему это не так?
Смотрите изображения того, что происходит ниже:
Появляется таблица:
![table appears](https://i.stack.imgur.com/TAHAO.png)
Ячейка расширяется:
![table expands](https://i.stack.imgur.com/TTI4D.png)
Ячейка разрушается:
![table collapses](https://i.stack.imgur.com/TAHAO.png)
Ячейка исчезает (при нажатии на ячейку снизу):
![cell disappears](https://i.stack.imgur.com/EYmiQ.png)
Продолжайте повторять до тех пор, пока не исчезнет весь раздел:
![section disappears](https://i.stack.imgur.com/nQ2m0.png)
РЕДАКТИРОВАТЬ: Переопределение альфы - это взлом,но работает.Вот еще один «хак», который также исправляет это, но ПОЧЕМУ это исправляет?
JVViewController.m line 125:
if( previousIndexPath_ != nil )
{
if( [previousIndexPath_ compare:indexPath] == NSOrderedSame ) currentCellSameAsPreviousCell = YES;
JVCell *previousCell = (JVCell*)[self cellForIndexPath:previousIndexPath_];
BOOL expanded = [previousCell expanded];
if( expanded )
{
[previousCell setExpanded:NO];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
else if( currentCellSameAsPreviousCell )
{
[previousCell setExpanded:YES];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
//[indicesToReload addObject:[previousIndexPath_ copy]];
}
EDIT 2:
Внесены несколько незначительных изменений в демонстрационный проект, которые стоит проверить и просмотреть в методе JSViewController didSelectRowAtIndexPath.