Ответ 1
У меня была эта проблема, и ответ для меня был "дох". Убедитесь, что вы вызываете super
реализацию prepareForReuse
в своей собственной реализации.
Следующая проблема не возникает в версиях 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
, но ничего не кажется для решения проблемы.
У меня была эта проблема, и ответ для меня был "дох". Убедитесь, что вы вызываете super
реализацию prepareForReuse
в своей собственной реализации.