通过拖动委托向上或向下拖动一行来重新排列表格中的部分(iOS 11)

问题描述 投票:1回答:2

我想在tableview中启用拖放功能。我只想在应用程序中拖动项目,我不希望它被转移到其他应用程序。

我发现了两种实现tableview重排的方法。

第一种方式:使用拖放委托

drag delegate documentation supporting drag and drop in tableview in iOS11

对我来说,不允许在应用程序之间拖放是非常重要的。

在这种情况下使用拖动委托确定吗?或者我应该使用其他解决方案?

// didLoad

[self.myTableView setDragDelegate: self];
[self.myTableView setDragInteractionEnabled: YES];

// itemsForRegisterDragSession

(NSArray<UIDragItem *> *)tableView:(UITableView *)tableView
                itemsForBeginningDragSession:(id<UIDragSession>)session
                                 atIndexPath:(NSIndexPath *)indexPath  API_AVAILABLE(ios(11.0)) {
Model *model = self.listOfX[indexPath.section];

NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithObject: model];

UIDragItem *dragItem = [[UIDragItem alloc] initWithItemProvider: itemProvider];

return @[dragItem];
}

第二种方式:tableview编辑模式

[self.myTableView setEditing: YES];

我不想添加按钮并将表视图状态更改为编辑模式。我希望通过长按启用重新排列。

ios objective-c uitableview
2个回答
2
投票

您使用拖放代理的第一个选项很好。一定要实现UITableViewDragDelegate方法- (BOOL)tableView:(UITableView *)tableView dragSessionIsRestrictedToDraggingApplication:(id<UIDragSession>)session并返回YES。这将确保拖放必须在同一个应用程序中进行。


0
投票

如果弗洛里安·米尔克(Florian Mielke)为此目的使用过FMMoveTable,那么效果很好。但他现在已经停止使用它,说明你应该使用IOS 11拖放功能。虽然我看不出你如何将它限制在一个表中。

另一种可能性是使用this other StackOverflow answer中提到的教程。