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

时间:2017-08-25 20:33:58

标签: ios uitableview uidragitem

在表格视图中实施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 []
    }

这是说如果你不返回任何拖拽物品,表格视图仍然会允许拖动吗?!?!那怎么会阻止一行被拖动?

1 个答案:

答案 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:),但这可能是一个单独的问题。