Access a UICollectionView's parent UIViewController

前端 未结 1 874
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-16 03:25

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

相关标签:
1条回答
  • 2020-12-16 03:30

    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

    0 讨论(0)
提交回复
热议问题