为什么空的 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:)
,尽管这可能是单独的问题。
实施 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:)
,尽管这可能是单独的问题。