我有一个奇怪的问题,我无法弄清楚我错过了什么。我有一个可编辑的UITableView(即当我的UI加载时,我发送我的表setEditing:YES animated:YES消息)。表中的最后一行是“添加新”行。除了表格中最后一行之外的所有行都可以移动。没有行可以删除。
行正确显示,并且抓取器显示在除最后一行(按预期)之外的所有行的右侧。 问题是我无法移动行。当我点击抓取器移动行时,它有点摇晃,但我无法向上或向下拖动。以下是相关的代码片段:
- (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:proposedDestinationIndexPath:根本没有被调用。
关于我做错了什么的任何想法?关于我应该尝试解决这个问题的任何建议?
答案 0 :(得分:23)
我也有这个问题。检查你是否有一个UIGestureRecognizer(对我来说它是一个UIPanGestureRecognizer)附加到UITableView的超级视图。我删除它并重新排序工作。
答案 1 :(得分:2)
我最近遇到了同样的问题,这个线程指出了我正确的方向,但更好的方法是使用手势识别器的委托方法gestureRecognizerShouldBegin:来确定你是否处于你想要处理它的情况。
在我的情况下,我在主视图控制器上有一个滑动手势,并在子视图控制器中显示一个表。在gestureRecognizerShouldBegin中:当子视图控制器处于活动状态时,我返回NO,这允许表查看每个手势,并且容器视图控制器不处理任何操作。
答案 2 :(得分:1)
触摸控件后立即调用方法tableView:moveRowAtIndexPath:toIndexPath:
。来自UITableViewDataSource Protocol Reference:
当用户按下fromRow中的重新排序控件时,UITableView对象将此消息发送到数据源。
所以这是预期的行为。
我认为问题出在您的tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
。您是否有特定原因要包含此方法?您是否尝试过将其排除在拟议位置之外?
例如,似乎([proposedDestinationIndexPath row] < [self.itemArray count])
将始终返回true
...
答案 3 :(得分:0)
就我而言,正是“刷卡上的隐藏导航栏”功能导致重新排序失败。因此,如果您需要UITableView重新订购功能,请确保它已关闭。
navigationController?.hidesBarsOnSwipe = false
请注意,导航控制器在同一导航堆栈的所有视图控制器之间共享,因此即使在推/弹操作之后,一个屏幕也会影响所有其他控件。
答案 4 :(得分:0)
就我而言,问题出在keyboardDismissMode
属性中。