在表格视图中实施iOS 11拖放。如果我不想拖动第一行,我假设我从tableView返回一个空数组(:itemsForBeginning :)
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
if indexPath.row == 0 {
return []
}
let dragItems = self.dragItems(forRowAt: indexPath)
print("dragging row index \(String(describing: dragItems.first?.localObject as? Int))")
return dragItems
}
当您不允许用户拖动内容时,返回一个空数组 来自指定的索引路径。
但是即使它确认[]被返回,拖动仍然会发生。这意味着要么我搞砸了,要么没有按照文件记录实现该功能。我总是犹豫不决,认为它是其他人,所以我的问题是,如果实施的[]的返回实际上应该阻止0行的拖拽?其他人验证这一点或将其显示为有记录的工作吗?
由于
编辑:来自WWDC视频的示例代码包含此块:
if tableView.isEditing {
// User wants to reorder a row, don't return any drag items. The table view will allow a drag to begin for reordering only.
return []
}
这是说如果你不返回任何拖拽物品,表格视图仍然会允许拖动吗?!?!那怎么会阻止一行被拖动?
答案 0 :(得分:2)
感谢@Losiowaty指出了有用的方向。
我知道在tableView中,如果只有一个tableView(:moveRowAt:)
,则drop委托会查找UIDragItem
。我没有在任何地方看到记录的是它也用tableView(:canMoveRowAt:)
进行了检查,尽管现在回想起来似乎很明显。
我的canMoveRowAt
看起来像这样:
// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable. If coded that the first row is non-editable, that row is by definition also non-re-orderable
return true
}
注意方法内的注释。我不知道我是在撰写评论还是从某个地方复制了评论。我阻止第0行可编辑(在编辑模式下可删除并可重新排序),并允许覆盖canMoveRowAt
,但显然可以忽略iOS 11的拖放。所以解决方案应该是明确的,如:
// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable.
if indexPath.row == 0 {return false}
return true
}
诊断这一点的另一个复杂性是,iPad上的iMessage应用程序中的相同代码未达到tableView(:moveRowAt:)
,而是在iPhone上到达那里。对于iOS应用程序,iPad和iPhone都可以访问tableView(:moveRowAt:)
,但这可能是一个单独的问题。