Почему ячейки моего табличного представления исчезают при перезагрузке с использованием reloadRowsAtIndexPaths? - PullRequest
19 голосов
/ 10 марта 2012

У меня есть пример проекта здесь:

http://dl.dropbox.com/u/7834263/ExpandingCells.zip

В этом проекте UITableView имеет пользовательский UITableViewCell.В каждой ячейке есть 3 UIViews, содержащие метку.

Цель состоит в том, чтобы развернуть ячейку при касании, а затем свернуть ее при повторном касании.Сама ячейка должна изменить свою высоту, чтобы выставить подпредставления.Вставка или удаление строк недопустимы.

Демонстрационный проект работает почти так, как ожидается.На самом деле в iOS 4.3 все работает отлично.Однако в iOS 5, когда строки разрушаются, предыдущие ячейки волшебным образом исчезают.

Чтобы заново создать проблему, запустите проект в симуляторе или устройстве с iOS 5 и коснитесь первой ячейки, чтобы развернуть ее.Затем снова нажмите на ячейку, чтобы свернуть ее.Наконец, коснитесь клетки прямо под ней.Предыдущий исчезает.

Продолжение постукивания по каждой ячейке в разделе приведет к исчезновению всех ячеек, в которых отсутствует весь раздел.

Я также попытался использовать reloadData вместотекущей настройки, но это разрушает анимацию и все равно выглядит как хак.reloadRowsAtIndexPaths должен работать, но вопрос в том, почему это не так?

Смотрите изображения того, что происходит ниже:

Появляется таблица:

table appears

Ячейка расширяется:

table expands

Ячейка разрушается:

table collapses

Ячейка исчезает (при нажатии на ячейку снизу):

cell disappears

Продолжайте повторять до тех пор, пока не исчезнет весь раздел:

section disappears

РЕДАКТИРОВАТЬ: Переопределение альфы - это взлом,но работает.Вот еще один «хак», который также исправляет это, но ПОЧЕМУ это исправляет?

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.

Ответы [ 12 ]

0 голосов
/ 20 марта 2012

Попробуйте, надеюсь, это поможет вам Расширение ячейки

0 голосов
/ 16 марта 2012

@ Javy, я заметил странное поведение при тестировании вашего приложения.

Во время работы на Имитаторе iPhone 5.0 предыдущая переменнаяIndexpth_ имеет значение

class NSArray (этовыглядит так.) здесь вывод отладчика

 (lldb) po previousIndexPath_
    (NSIndexPath *) $5 = 0x06a67bf0 <__NSArrayI 0x6a67bf0>(

    <JVSectionData: 0x6a61230>,

    <JVSectionData: 0x6a64920>,

    <JVSectionData: 0x6a66260>
    )

    (lldb) po [previousIndexPath_ class]

    (id) $7 = 0x0145cb64 __NSArrayI

В то время как в iPhone 4.3 симулятор имеет тип NSIndexPath.

lldb) po [previousIndexPath_ class]

(id) $5 = 0x009605c8 NSIndexPath

(lldb) po previousIndexPath_

(NSIndexPath *) $6 = 0x04b5a570 <NSIndexPath 0x4b5a570> 2 indexes [0, 0]

Знаете ли вы оЭта проблема?Не уверен, поможет ли это, но подумал дать вам знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...