2013-12-27 4 views
5

Я не совсем уверен, что здесь происходит, но я столкнулся с контактной формой, с которой я работаю. В моей форме я добавил возможность добавления адреса электронной почты контакту. Как показано на рисунке ниже, как только пользователь нажимает «добавить адрес электронной почты», строка добавляется в раздел «Электронные письма».UITableView deleteRowsAtIndexPaths не работает

Create contact image

Однако после того, как я нажимаю удалить электронную почту, дополнительные ячейки появляются под кнопку Добавить адрес электронной почты (на фото ниже).

before and after

Там немного красная коробка от того, что, как представляется, до удаления клеток, как если бы таблица не перезагружается. Вот мой код удаления:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     // Update the data source 
     NSMutableArray *fields = (NSMutableArray *)self.fields[@(indexPath.section)]; 
     [fields removeObjectAtIndex:indexPath.row]; 
     NSMutableArray *values = (NSMutableArray *)self.values[@([self fieldTypeAtIndexPath:indexPath])]; 
     [values removeObjectAtIndex:indexPath.row]; 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle]; 
    } 
} 

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

ответ

0

Вариант 1: Прежде чем вызывать deleteRowsAtIndexPaths, вы должны убедиться, что numberOfRowsInSection вернет правильное значение (например, если у вас первоначально было 2 строки в этом разделе, теперь он должен вернуть 1 строку).

Вариант 2: Если это не проблема, я бы попробовал другой тип анимации (например, UITableViewRowAnimationAutomatic), чтобы убедиться, что это имеет какой-либо эффект.

Вариант 3: Убедитесь, что cellForRowAtIndexPath возвращает действительную ячейку с сбросом ее содержимого. В противном случае он может повторно использовать недопустимую ячейку или отображать что-то, что было там раньше.

Вариант 4: Поскольку высоты разные, убедитесь, что heightForRowAtIndexPath возвращает правильное значение. You probably need to call reloadRowsAtIndexPaths, чтобы посмотреть в таблице, чтобы узнать о разнице в высоте.

+0

Он возвращает правильное число. И я считаю, что вы имеете в виду 'numberOfRowsInSection' ... –

+0

@NickONeill: Вы пробовали другой тип анимации? таких как автоматический? – Senseful

+0

На самом деле дайте мне 1 секунду. Возможно, вы правы. –

1

Это похоже на ошибку.

Я только заметил, что даже у Apple есть эта же ошибка в приложении напоминаний. Кажется, что это связано с удалением строк из UITableView с элементами переменной высоты.

В приложении «Напоминания Apple», когда вы удаляете что-то из длинного списка с элементами переменной высоты, вы увидите тот же точный визуальный артефакт в течение секунды. Затем таблица перескакивает, и список выглядит правильно. Я предполагаю, что Apple просто перезагружает весь вид таблицы через секунду после удаления элемента, чтобы исправить визуальный сбой.

Моя рекомендация - сообщить об этом как об ошибке для Apple. Пока вы можете перезагрузить весь вид таблицы, как предположительно Apple.

+0

У меня такая же проблема. Даже когда я перезагружаюсь, удаленная ячейка становится удаленной и отображается в состоянии удаления (Delete is visible). – Armin

0

У меня была такая же проблема, и я предполагаю, что это может быть ошибка в iOS7, где она не перерисовывает ячейки правильно, я исправил ее, но не эффективно, просто в «cellForRowAtIndexPath», всегда создавайте новую ячейки, не удаляйте его.

Смежные вопросы