DequeueReusableCellWithIdentifier возвращает ячейки в состоянии редактирования в IOS 7

Следующая проблема не возникает в версиях IOS до 7.

С помощью интерфейса UITableView для редактирования элементов, удаляющих элемент, после удаления элемента и прокрутки вновь отображаемая ячейка (возвращается из dequeueReusableCellWithIdentifier) выглядит следующим образом:

https://dl.dropboxusercontent.com/u/87749409/Screenshot%202013.09.27%2016.08.30.png

[Это изображение может быть недоступно навсегда, поэтому здесь описание: после прокрутки новая ячейка все еще находится в окончательном отредактированном состоянии, при этом кнопка DELETE все еще видна, а содержимое ячейки слева от экрана.]

Кроме того, в возвращаемой ячейке даже установлен флаг editing.

Код, который я использую для удаления ячеек, выглядит следующим образом:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        // Find the item that this cell represents
        NSDictionary *item = [self itemForRowAtIndexPath:indexPath];
        if (!item) return;

        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
        [tableView endUpdates];

        // Remove it from the data store
        [Inventory removeInventoryItem:item];
    }
}

Я смог преодолеть это с помощью взломанного решения. Код (с взломом):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    InventoryCell *cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID];

    // HACK - here we create a new cell when we try to reuse deleted cells. 
    // Deleted cells, when re-used, would still appear as if they were edited,
    // with the cell slid off to the far left and the DELETE button visible.
    while(cell && cell.editing)
    {
        cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID];
    }

    if (!cell)
    {
        cell = [[InventoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kInventoryCellID];
    }

    return cell;
}

С помощью взлома (цикл while) создается новая ячейка, которая не находится в состоянии редактирования. Это приводит к немного потерянной памяти, но приводит к правильному результату.

Интересно, есть ли что-то, что мне нужно сделать в методе prepareForReuse для reset состояния редактирования. В настоящее время мой метод prepareForReuse инициализирует элементы управления внутри (метки и т.д.) Со значениями по умолчанию.

Я попытался позвонить setEditing:animated: на оба: UITableViewCell и UITableView при удалении ячейки, в prepareForReuse и всякий раз, когда dequeueReusableCellWithIdentifier: возвратил ячейку, у которой все еще был установлен флаг editing, но ничего не кажется для решения проблемы.

Ответы

Ответ 1

У меня была эта проблема, и ответ для меня был "дох". Убедитесь, что вы вызываете super реализацию prepareForReuse в своей собственной реализации.