indexPathForRow (at: location) всегда [0, 0] - PullRequest
1 голос
/ 29 апреля 2020

Я читаю, но не могу исправить это странное поведение.

Я использую UIContextMenu в приложении Ma c Catalyst. Всякий раз, когда пользователь щелкает правой кнопкой мыши по 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)

Но результат всегда один и тот же.

Я что-то здесь не так делаю?

1 Ответ

1 голос
/ 29 апреля 2020

Значение, которое вы получаете в обратном вызове из контекстного меню, равно 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]
        ...
    }
}

...