一尘不染

访问UICollectionView的父UIViewController

swift

我的问题很简单。我有一个包含UICollectionView的UIViewController。在初始化单元格时,我向每个单元格添加了一个手势识别器,以便在按住时可以使用选择器调用一个函数。

然后,此函数创建一个我要呈现的UIAlertController。(基本上,您拥有一个单元格,它询问您是否要删除它,如果您说是,它会从CollectionView中删除它)

问题是我无法从UICollectionView中显示UIAlertController,因为它不是ViewController。

我想以编程方式从UICollectionView实现内部的函数中获取包含UICollectionView的UIViewController,以显示此警报。


阅读 317

收藏
2020-07-07

共1个答案

一尘不染

我通过在自定义协议中制定协议来完成此任务UICollectionViewCell,并将这些事件委托给UIViewController,就像这样

在你的MyCollectionViewCell

protocol MyCollectionViewCellDelegate: class {
    func didLongPressCell()
}

class MyCollectionViewCell:UICollectionViewCell {

    weak var delegate:MyCollectionViewCellDelegate?

    func longPressAction() {
        if let del = self.delegate {
            del.didLongPressCell
        }
    }

}

然后回到你的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
    }

}

要记住的重要位是为每个单元格设置委托

cell.delegate = self

并在您要在其中接收事件的视图控制器中采用新协议

class MyViewController:UIViewController, MyCollectionViewCellDelegate

我还没有测试过这段代码,也不确定在这样的每个单元格中存储对viewController的引用的最佳实践,但是我做的非常相似,请告诉我您的情况。


编辑: 如果您已经将您的子类化,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 {
            // make use of the reference to the view controller here
        }
    }

}

UICollectionViewCell会和以前一样

2020-07-07