Перезагрузка таблицы и сенсорные жесты

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

  1. Вы получаете новые данные.
  2. Вызов beginUpdates
  3. Вызов deleteRowsAtIndexPaths:withRowAnimation: удалить ячейки для любых старых элементов, которые были удалены в новых данных.
  4. Вызов insertRowsAtIndexPaths:withRowAnimation: добавить новые ячейки для любых элементов, которые были добавлены в новые данные.
  5. Если вам по какой-то причине необходимо выборочно заменить конкретную ячейку (и вы не можете просто обновить подпредставления существующей ячейки новыми данными), используйте reloadRowsAtIndexPaths:withRowAnimation:,
  6. Вызов commitUpdates, На данный момент ваш UITableViewDataSource методы должны отражать новые данные (например, tableView:numberOfRowsInSection: должен отражать измененное количество и tableView:cellForRowAtIndexPath: следует использовать новинки).
  7. В табличном представлении теперь будут вызываться методы источника данных, необходимые для обновления отображения. Существующие строки не будут изменены.

Установите BOOL как aCellIsSelected в YES, когда вы касаетесь ячейки

и просто перезагрузите просмотр таблицы, если aCellIsSelected НЕТ

Другие вопросы по тегам