我的问题相当简单.我有一个包含UICollectionView的UIViewController.在初始化我的单元格时,我为每个单元格添加了一个手势识别器,这样当您点击并按住它时,可以使用选择器调用一个函数.
然后,此函数创建一个我想要呈现的UIAlertController.(基本上,你拿着一个单元格,它会询问你是否要删除它,如果你说是,它会从CollectionView中删除它)
问题是我不能从我的UICollectionView呈现UIAlertController,因为它不是ViewController.
我想以编程方式获取包含UICollectionView的UIViewController,以从UICollectionView实现中的函数呈现此警报.
我这样做是通过在我的自定义中创建一个协议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
将和以前一样