My question is fairly straightforward. I have a UIViewController containing a UICollectionView. In initialising my cells, I add a gesture recogniser to each of them so that when you tap and hold it calls a function with a selector.
This function then creates a UIAlertController which I want to present. (Basically, you hold a cell, it asks you if you want to delete it and if you say yes it eliminates it from the CollectionView)
The problem is that I can't present a UIAlertController from my UICollectionView because it isn't a ViewController.
I want to programmatically get the UIViewController that contains the UICollectionView to present this alert from a function that is inside the UICollectionView implementation.
I do this by making a protocol in my custom UICollectionViewCell
and delegate these events back to the UIViewController
, something like this
In your MyCollectionViewCell
protocol MyCollectionViewCellDelegate: class {
func didLongPressCell()
}
class MyCollectionViewCell:UICollectionViewCell {
weak var delegate:MyCollectionViewCellDelegate?
func longPressAction() {
if let del = self.delegate {
del.didLongPressCell
}
}
}
Then back in your 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() {
// do what you want with the event from the cell here
}
}
The important bits to remember are to set the delegate for each cell
cell.delegate = self
And adopt your new protocol in the view controller that you want to receive the events in
class MyViewController:UIViewController, MyCollectionViewCellDelegate
I have not tested this code and I'm not sure on best practice of storing references to the viewController in every cell like this, but i do something very similar, let me know how you get on.
Edit: if you have subclassed your UICollectionView
then pass it a reference to the view controller so that you can use it like so.
Your MyViewController
would now look like this
class MyViewController:UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let collectionView = MyCollectionView()
collectionView.viewController = self
self.view.addSubview(collectionView)
}
}
And your custom collection view 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 {
// make use of the reference to the view controller here
}
}
}
The UICollectionViewCell
would be the same as before
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With