为什么空的 UIDragItem 数组仍然允许拖动行?

Why does empty UIDragItem array still allow row to be dragged?

实施 iOS 11 在 table 视图中拖放。如果我不想拖动第一行,我假设我 return 来自 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
}

Return an empty array when you do not allow the user to drag content from the specified index path.

但即使确认 [ ] 已 returned,拖拽仍然发生。这意味着要么我搞砸了,要么该功能没有按照文档实现。我总是犹豫是否认为它是其他人,所以我的问题是 [] 的 return 实施是否实际上应该阻止 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 []
    }

这是说如果你不return任何拖动项目,table视图仍然允许拖动?!?!那么如何防止一行被拖拽呢?

感谢@Losiowaty 指出有用的方向。

我知道在 tableView 中,如果只有一个 UIDragItem,drop delegate 会查看 tableView(:moveRowAt:)。我没有在任何地方看到记录的是它也用 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,但显然 iOS11 拖放会忽略它。所以解决方案是明确的,如:

// 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:),尽管这可能是单独的问题。