我的问题很简单。我有一个包含UICollectionView的UIViewController。在初始化单元格时,我向每个单元格添加了一个手势识别器,以便在按住时可以使用选择器调用一个函数。
然后,此函数创建一个我要呈现的UIAlertController。(基本上,您拥有一个单元格,它询问您是否要删除它,如果您说是,它会从CollectionView中删除它)
问题是我无法从UICollectionView中显示UIAlertController,因为它不是ViewController。
我想以编程方式从UICollectionView实现内部的函数中获取包含UICollectionView的UIViewController,以显示此警报。
我通过在自定义协议中制定协议来完成此任务UICollectionViewCell,并将这些事件委托给UIViewController,就像这样
UICollectionViewCell
UIViewController
在你的MyCollectionViewCell
MyCollectionViewCell
protocol MyCollectionViewCellDelegate: class { func didLongPressCell() } class MyCollectionViewCell:UICollectionViewCell { weak var delegate:MyCollectionViewCellDelegate? func longPressAction() { if let del = self.delegate { del.didLongPressCell } } }
然后回到你的MyViewController
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则将其传递给视图控制器一个引用,以便您可以像这样使用它。
UICollectionView
您MyViewController现在看起来像这样
class MyViewController:UIViewController { override func viewDidLoad() { super.viewDidLoad() let collectionView = MyCollectionView() collectionView.viewController = self self.view.addSubview(collectionView) } }
还有您的自定义收藏夹视图MyCollectionView
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会和以前一样