【问题标题】:Why does empty UIDragItem array still allow row to be dragged?为什么空的 UIDragItem 数组仍然允许拖动行?
【发布时间】:2017-08-25 20:33:57
【问题描述】:

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

这是说如果你不返回任何拖动项,表格视图仍然允许拖动?!?!那么如何防止一行被拖动呢?

【问题讨论】:

  • 当你只是做return []时会发生同样的事情吗?
  • 是的,它适用于纯 return []
  • 您是否允许编辑表格视图,即重新排序行的旧方法?
  • @Losiowaty,您找到了答案。如果你想发布它,我会让你接受它。如果没有,我会发布它。它与 canMoveRowAt 相关,我在 10.x 中就这样做了,但在 11.x 中存在一些变化。感谢您提出的问题!
  • @JKaz 继续发布它,我很乐意为它投票 :) 我所做的只是让你朝着正确的方向轻推。

标签: ios uitableview uidragitem


【解决方案1】:

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

我知道在 tableView 中,如果只有一个 UIDragItem,则删除委托会查找 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,但这显然被 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 应用程序,tableView(:moveRowAt:) 在 iPad 和 iPhone 上都可以访问,尽管这可能是单独的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多