indexPathForRow(at: location) всегда [0, 0]

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

Я использую UIContextMenuв приложении Mac 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 ответ

Решение

Значение, которое вы получаете в обратном вызове из контекстного меню, - CGPoint, которая является координатой того, где произошел щелчок в координатном пространстве представления взаимодействия. (документация)

Пути индексов - это не координаты, а целые индексы ваших строк, начиная с нуля.

Чтобы добиться того, что вы пытаетесь сделать, вам понадобится дополнительный шаг, чтобы спросить представление таблицы, какой индекс строки под данной координатой. Результат не является обязательным и равенnil если щелчок не попал ни в одну строку.

Еще одна вещь для получения правильного результата - это использовать UIContextMenuInteraction"S метод, чтобы получить координаты в пространстве координат в виде таблицы.

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

Другие вопросы по тегам