Невозможно переместить строки в UITableView, даже когда отображается граббер - PullRequest
13 голосов
/ 31 марта 2012

У меня странная проблема, и я не могу понять, что мне не хватает. У меня есть 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: вообще не вызывается.

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

Ответы [ 6 ]

28 голосов
/ 23 января 2013

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

panRecognizer.cancelsTouchesInView = NO;
23 голосов
/ 12 апреля 2012

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

2 голосов
/ 17 декабря 2012

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

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

1 голос
/ 01 апреля 2012

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

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

Так что это ожидаемое поведение.

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

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

0 голосов
/ 11 октября 2017

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

0 голосов
/ 20 октября 2016

В моем случае, это функция «Скрыть панель навигации при пролистывании», которая привела к сбою повторного заказа. Поэтому убедитесь, что он отключен, если вам нужна функция повторного заказа UITableView.

navigationController?.hidesBarsOnSwipe = false

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...