1

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

UIContextMenu在 Mac Catalyst 应用程序中使用 a 。每当用户右键单击时,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)

但结果总是一样的。

我在这里做错了吗?

4

1 回答 1

1

您在上下文菜单的回调中收到的值是CGPoint,它是在交互视图的坐标空间中发生单击的坐标。(文档

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

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

获得正确结果的另一件事是使用UIContextMenuInteraction'方法获取表格视图坐标空间内的坐标。

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]
        ...
    }
}

于 2020-04-29T10:36:26.357 回答