Подтвердить что ты не робот

Невозможно перемещать строки в UITableView, даже когда граббер отображается

У меня есть несколько странная проблема, и я не могу понять, что мне не хватает. У меня есть UITableView, который редактируется на месте (т.е. Когда мой пользовательский интерфейс загружен, я отправляю свою таблицу: setEditing: YES animated: YES message). Последняя строка в таблице предназначена для строки "Добавить новую". Все строки, кроме последней строки в моей таблице, можно перемещать. Ни одна из строк не может быть удалена.

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

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewCellEditingStyleNone;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {   
    if (indexPath.row == [self.itemArray count] ) {
        return NO;
    }
    return YES;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == [self.itemArray count]) {
        return NO;
    }
    return YES;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    Item *item = [self.itemArray objectAtIndex:fromIndexPath.row];
    [self.itemArray removeObjectAtIndex:fromIndexPath.row];
    [self.itemArray insertObject:item atIndex:toIndexPath.row];
}

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
    if ([proposedDestinationIndexPath row] < [self.itemArray count]) {
        return proposedDestinationIndexPath;
    }
    NSIndexPath *betterIndexPath = [NSIndexPath indexPathForRow:[self.itemArray count]-1 inSection:0];
    return betterIndexPath;
}

При попытке отладки кажется, что tableView: moveRowAtIndexPath: вызывается почти сразу, даже когда я держусь за граббер (т.е. я еще не поднял палец). Кроме того, мой tableView: targetIndexPathForMoveFromRowAtIndexPath: предложилDestinationIndexPath: вообще не запускается.

Любые мысли о том, что я делаю неправильно? Любые предложения о том, что я должен попытаться решить эту проблему?

4b9b3361

Ответ 1

У меня тоже была эта проблема. Проверьте, есть ли у вас UIGestureRecognizer (для меня это был UIPanGestureRecognizer), который подключен к супервизорам UITableView. Я удалил его, и переупорядочение продолжилось.

Ответ 2

У меня была та же проблема, и ответы @wilsontgh и @Andy взяли меня в правильном направлении. Однако я не мог позволить себе удалить необходимый PanRecognizer из супервизора или отключить его в определенных представлениях. Что для меня работало, это установить это на главном устройстве распознавания, которое позволяет избежать отмены касаний, обрабатываемых другими видами/распознавателями.

panRecognizer.cancelsTouchesInView = NO;

Ответ 3

Недавно у меня была такая же проблема, и этот поток указал мне в правильном направлении, но лучший подход заключается в использовании метода делегирования-распознавателя распознавания жестовRecognizerShouldBegin: чтобы определить, находитесь ли вы в ситуации, когда вы хотите ее обработать или нет.

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

Ответ 4

Метод tableView:moveRowAtIndexPath:toIndexPath: вызывает вызов сразу после касания элемента управления. Из UITableViewDataSource Protocol Reference:

Объект UITableView отправляет это сообщение в источник данных, когда пользователь нажимает на регулятор переадресации fromRow.

Итак, это ожидаемое поведение.

Я считаю, что проблема в вашем tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:. У вас есть конкретная причина включить этот метод? Вы пытались оставить это и пойти с предложенной позицией?

Например, кажется, что ([proposedDestinationIndexPath row] < [self.itemArray count]) всегда будет возвращать true...

Ответ 5

В моем случае это функция "hide nav bar on swipe", которая привела к сбою повторного заказа. Поэтому убедитесь, что он выключен, если вам нужна функция повторного заказа UITableView.

navigationController?.hidesBarsOnSwipe = false

Обратите внимание, что контроллер навигации разделяется между всеми контроллерами представлений одного и того же навигационного стека, поэтому один экран может влиять на все остальные даже после нажатия/всплытия.

Ответ 6

В моем случае проблема была в свойстве keyboardDismissMode.