I do this by creating a protocol in my user account UICollectionViewCelland delegating these events back to UIViewController, something like this
AT MyCollectionViewCell
protocol MyCollectionViewCellDelegate: class {
func didLongPressCell()
}
class MyCollectionViewCell:UICollectionViewCell {
weak var delegate:MyCollectionViewCellDelegate?
func longPressAction() {
if let del = self.delegate {
del.didLongPressCell
}
}
}
Then go back to MyViewController
class MyViewController:UIViewController, MyCollectionViewCellDelegate {
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell
cell.delegate = self
return cell
}
func didLongPressCell() {
}
}
Important bits to remember is the assignment of a delegate to each cell.
cell.delegate = self
And accept your new protocol in the view controller that you want to receive in
class MyViewController:UIViewController, MyCollectionViewCellDelegate
I have not tested this code, and I'm not sure of the best practice of storing links to the viewController in each cell like this, but I am doing something very similar, let me know how you do it.
:, UICollectionView, , .
MyViewController
class MyViewController:UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let collectionView = MyCollectionView()
collectionView.viewController = self
self.view.addSubview(collectionView)
}
}
MyCollectionView
class MyCollectionView:UICollectionView, MyCollectionViewCellDelegate {
weak var viewController:UIViewController?
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell
cell.delegate = self
return cell
}
func didLongPressCell() {
if let vc = self.viewController {
}
}
}
UICollectionViewCell ,