Здесь у меня есть пример с образцом:
http://dl.dropbox.com/u/7834263/ExpandingCells.zip
В этом проекте UITableView имеет пользовательский UITableViewCell. В каждой ячейке находятся 3 UIViews, содержащие метку.
Цель состоит в том, чтобы развернуть ячейку при нажатии, а затем свернуть ее при повторном нажатии. Сама ячейка должна изменить ее высоту, чтобы открыть подзоны. Вставка или удаление строк неприемлема.
Демо-проект работает почти так, как ожидалось. Фактически, в iOS 4.3 он работает отлично. Однако в iOS 5, когда строки рушится, предыдущие ячейки волшебным образом исчезают.
Чтобы повторно создать проблему, запустите проект в симуляторе или устройстве с помощью iOS 5 и коснитесь первой ячейки, чтобы развернуть ее. Затем снова коснитесь ячейки, чтобы свернуть ее. Наконец, коснитесь ячейки непосредственно под ней. Предыдущее исчезает.
Продолжение прослушивания для каждой ячейки в секции приведет к исчезновению всех ячеек, где отсутствует весь раздел.
Ive также попытался использовать reloadData вместо текущей настройки, но это разрушает анимацию и в любом случае немного похож на хак. reloadRowsAtIndexPaths должен работать, но вопрос в том, почему это не так?
Смотрите изображения того, что происходит ниже:
Появится таблица:
Ячейка расширяется:
Клетка разрушается:
Ячейка исчезает (при нажатии на ячейку внизу):
Продолжайте повторять, пока не исчезнет весь раздел:
EDIT: Переопределение альфы - это взлом, но работает. Вот еще один "взлом", который также исправляет его, но ПОЧЕМУ он его исправляет?
JVViewController.m строка 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]];
}
ИЗМЕНИТЬ 2:
Сделал несколько незначительных изменений в демонстрационном проекте, стоит проверить и рассмотреть метод JVViewController didSelectRowAtIndexPath.