Ответ 1
У меня тоже была эта проблема. Проверьте, есть ли у вас UIGestureRecognizer (для меня это был UIPanGestureRecognizer), который подключен к супервизорам 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: вообще не запускается.
Любые мысли о том, что я делаю неправильно? Любые предложения о том, что я должен попытаться решить эту проблему?
У меня тоже была эта проблема. Проверьте, есть ли у вас UIGestureRecognizer (для меня это был UIPanGestureRecognizer), который подключен к супервизорам UITableView. Я удалил его, и переупорядочение продолжилось.
У меня была та же проблема, и ответы @wilsontgh и @Andy взяли меня в правильном направлении. Однако я не мог позволить себе удалить необходимый PanRecognizer из супервизора или отключить его в определенных представлениях. Что для меня работало, это установить это на главном устройстве распознавания, которое позволяет избежать отмены касаний, обрабатываемых другими видами/распознавателями.
panRecognizer.cancelsTouchesInView = NO;
Недавно у меня была такая же проблема, и этот поток указал мне в правильном направлении, но лучший подход заключается в использовании метода делегирования-распознавателя распознавания жестовRecognizerShouldBegin: чтобы определить, находитесь ли вы в ситуации, когда вы хотите ее обработать или нет.
В моей ситуации у меня был жестом салфетки на главном контроллере представления и показывался стол в контроллере детского представления. В gestureRecognizerShouldBegin: я возвращаю NO, когда активный контроллер просмотра активен, что позволяет таблице видеть каждый жест, и контроллер представления контейнера ничего не обрабатывает.
Метод tableView:moveRowAtIndexPath:toIndexPath:
вызывает вызов сразу после касания элемента управления. Из UITableViewDataSource Protocol Reference:
Объект UITableView отправляет это сообщение в источник данных, когда пользователь нажимает на регулятор переадресации fromRow.
Итак, это ожидаемое поведение.
Я считаю, что проблема в вашем tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
. У вас есть конкретная причина включить этот метод? Вы пытались оставить это и пойти с предложенной позицией?
Например, кажется, что ([proposedDestinationIndexPath row] < [self.itemArray count])
всегда будет возвращать true
...
В моем случае это функция "hide nav bar on swipe", которая привела к сбою повторного заказа. Поэтому убедитесь, что он выключен, если вам нужна функция повторного заказа UITableView.
navigationController?.hidesBarsOnSwipe = false
Обратите внимание, что контроллер навигации разделяется между всеми контроллерами представлений одного и того же навигационного стека, поэтому один экран может влиять на все остальные даже после нажатия/всплытия.
В моем случае проблема была в свойстве keyboardDismissMode
.