Swift 5 CollectionView получает indexPath по ячейке longPress - PullRequest
0 голосов
/ 05 июня 2019

Я ищу способ получить indexPath или данные, когда я делаю longPress на ячейку. В основном я могу удалить альбом из collectionView, для этого мне нужно получить id .

Моя ячейка для элемента

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AlbumCollectionViewCell", for: indexPath) as! AlbumCollectionViewCell
    cell.data = albumsDataOrigin[indexPath.row]

    let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressGetstureDetected))
    cell.addGestureRecognizer(longPressGesture)

    return cell
}

longPressGetstureDetected

@objc func longPressGetstureDetected(){
    self.delegateAlbumView?.longPressGetstureDetected()
}

удалить функцию

func longPressGetstureDetected() {
    showAlertWith(question: "You wanna to delete this album?", success: {

        self.deleteAlbum() //Here i need to pass ID
    }, failed: {
        print("Delete cenceled")
    })
}

Для тех, кто ищет полный ответ

@objc func longPress(_ longPressGestureRecognizer: UILongPressGestureRecognizer) {

    if longPressGestureRecognizer.state == UIGestureRecognizer.State.began {
        let touchPoint = longPressGestureRecognizer.location(in: collectionView)
        if let index = collectionView.indexPathForItem(at: touchPoint) {
            self.delegateAlbumView?.longPressGetstureDetected(id: albumsDataOrigin[index.row].id ?? 0)
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Начните с получения координат печати, используя gesture.location(in:) Ссылка: https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624219-location

Затем используйте indexPathForItem(at:), чтобы получить IndexPath ячейки, к которой прикоснулись.Ссылка: https://developer.apple.com/documentation/uikit/uicollectionview/1618030-indexpathforitem

Исходя из этого, вам, вероятно, не требуется различный распознаватель жестов для каждой ячейки, возможно, вы можете зарегистрировать его в представлении коллекции один раз.


Решение, предоставленноеДжордж Хайнц, основываясь на вышесказанном:

@objc func longPress(_ longPressGestureRecognizer: UILongPressGestureRecognizer) {

    if longPressGestureRecognizer.state == UIGestureRecognizer.State.began {
        let touchPoint = longPressGestureRecognizer.location(in: collectionView)
        if let index = collectionView.indexPathForItem(at: touchPoint) {
            self.delegateAlbumView?.longPressGetstureDetected(id: albumsDataOrigin[index.row].id ?? 0)
        }
    }
}

Я бы порекомендовал использовать State.recognized вместо State.began, ваш пробег может отличаться!

0 голосов
/ 05 июня 2019
import UIKit

extension UIResponder {

    func next<T: UIResponder>(_ type: T.Type) -> T? {
        return next as? T ?? next?.next(type)
    }
}

extension UICollectionViewCell {

    var collectionView: UICollectionView? {
        return next(UICollectionView.self)
    }

    var indexPath: IndexPath? {
        return collectionView?.indexPath(for: self)
    }
}

С помощью этого расширения вы можете узнать indexPath представления коллекции из файла ячейки представления коллекции. И вы можете просто найти идентификатор фотографии по indexPath из массива данных и удалить его.

...