当前位置:  开发笔记 > IOS > 正文

访问UICollectionView的父UIViewController

如何解决《访问UICollectionView的父UIViewController》经验,为你挑选了1个好方法。

我的问题相当简单.我有一个包含UICollectionView的UIViewController.在初始化我的单元格时,我为每个单元格添加了一个手势识别器,这样当您点击并按住它时,可以使用选择器调用一个函数.

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

问题是我不能从我的UICollectionView呈现UIAlertController,因为它不是ViewController.

我想以编程方式获取包含UICollectionView的UIViewController,以从UICollectionView实现中的函数呈现此警报.



1> Wez..:

我这样做是通过在我的自定义中创建一个协议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将和以前一样

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有