Перезагрузка таблицы и сенсорные жесты
У меня есть таблица, которая перезагружается при добавлении нового контента, используя [tableview reloadData];
Проблема в том, что у меня есть UILongPressGestureRecognizer для TableCells в таблице, и поскольку ячейки / таблица перезагружаются довольно часто, LongPress не всегда имеет время для работы, как я полагаю, его внутренние таймеры сбрасываются, когда ячейка / таблица выполняется перезагружается.
3 ответа
Вы пытались смотреть на состояние вашего UILongPressGestureRecognizer
с до [tableView reloadData]
называется? Например:
// Returns |YES| if a gesture recognizer began detecting a long tap gesture
- (BOOL)longTapPossible {
BOOL possible = NO;
UIGestureRecognizer *gestureRecognizer = nil;
NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows];
for (NSIndexPath *indexPath in visibleIndexPaths) {
// I suppose you have only one UILongPressGestureRecognizer per cell
gestureRecognizer = [[tableView cellForRowAtIndexPath:indexPath] gestureRecognizers]
lastObject];
possible = (gestureRecognizer.state == UIGestureRecognizerStateBegan ||
gestureRecognizer.state == UIGestureRecognizerStateChanged);
if (possible) {
break;
}
}
return possible;
}
// ... later, where you reload the tableView:
if ([self longTapPossible] == NO) {
[tableView reloadData];
}
Дайте мне знать, если это работает!
Не использовать reloadData
если вы хотите, чтобы существующие ячейки остались. Вместо этого, когда вы получаете новые данные, используйте методы " Вставка и удаление ячеек", чтобы сообщить табличному представлению, какие именно ячейки изменились. Общая процедура:
- Вы получаете новые данные.
- Вызов
beginUpdates
- Вызов
deleteRowsAtIndexPaths:withRowAnimation:
удалить ячейки для любых старых элементов, которые были удалены в новых данных. - Вызов
insertRowsAtIndexPaths:withRowAnimation:
добавить новые ячейки для любых элементов, которые были добавлены в новые данные. - Если вам по какой-то причине необходимо выборочно заменить конкретную ячейку (и вы не можете просто обновить подпредставления существующей ячейки новыми данными), используйте
reloadRowsAtIndexPaths:withRowAnimation:
, - Вызов
commitUpdates
, На данный момент вашUITableViewDataSource
методы должны отражать новые данные (например,tableView:numberOfRowsInSection:
должен отражать измененное количество иtableView:cellForRowAtIndexPath:
следует использовать новинки). - В табличном представлении теперь будут вызываться методы источника данных, необходимые для обновления отображения. Существующие строки не будут изменены.
Установите BOOL как aCellIsSelected в YES, когда вы касаетесь ячейки
и просто перезагрузите просмотр таблицы, если aCellIsSelected НЕТ