Я знаю, что этот вопрос древний, но сейчас он является третьим результатом в Google, и я нашел другой и очень простой метод, который я не видел в других документах. (Мне не нужно просто манипулировать представленным элементом, но мне нужно выполнить более сложную работу в моем приложении.)
NSCollectionView
наследуется от NSView
, поэтому вы можете просто создать собственный подкласс и переопределить mouseDown
. Это не совсем без ловушек - вам нужно проверить количество кликов и преобразовать точку из главного окна в координату представления вашей коллекции, прежде чем использовать NSCollectionView
s indexPathForItem
метод:
override func mouseDown(with theEvent: NSEvent) {
if theEvent.clickCount == 2 {
let locationInWindow = theEvent.locationInWindow
let locationInView = convert(locationInWindow, from: NSApplication.shared.mainWindow?.contentView)
if let doubleClickedItem = indexPathForItem(at: locationInView){
// handle double click - I've created a DoubleClickDelegate
// (my collectionView's delegate, but you could use notifications as well)
...
Такое ощущение, что я наконец нашел метод, который Apple намеревался использовать - в противном случае нет никаких оснований для существования indexPathForItem(at:)
.