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