indexPathForRow(at: location) 总是 [0, 0]

indexPathForRow(at: location) always [0, 0]

我一直在阅读,但我无法解决这个奇怪的行为。

我在 Mac Catalyst 应用程序中使用 UIContextMenu。每当用户右键单击 tableViewCell 我需要获取该行的数据源对象。

我已经实施了以下内容:

func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
    let indexPath = tableView.indexPathForRow(at: location)
    print("location:", location)

    let object = ds[indexPath.row]

    //.... rest of the code
}

即使我有更多的单元格,上面总是打印出 indexPath 是 (0, 0)

我尝试使用以下方法将位置转换为 tableView

let locationInTableView = view.convert(location, to: tableView)

然后将其用于:

let indexPath = tableView.indexPathForRow(at: locationInTableView)

但结果总是一样

我是不是做错了什么?

您在上下文菜单的回调中收到的值是 CGPoint,这是点击发生在交互视图坐标 space 中的坐标。 (documentation)

索引路径不是坐标,而是从零开始的行的整数索引。

要实现您想要做的事情,您需要一个额外的步骤来询问 table 视图给定坐标下的行索引是什么。结果是可选的,如果点击没有落在任何行的顶部,则结果为 nil

获得正确结果的另一件事是使用 UIContextMenuInteractionmethod 获取 table 视图坐标 space 内的坐标。

func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {

    let locationInTableView = interaction.location(in: tableView)
    guard let indexPath = tableView.indexPathForRow(at point: locationInTableView) else {
        // clicked not on a row
        return
    }
    let object = ds[indexPath.row]
        ...
    }
}