如何从自定义 UICollectionViewCell NIB 呈现 popoverPresentationController

How to present a popoverPresentationController from custom UICollectionViewCell NIB

我有一个在 UIViewController 中定义的弹出窗口,但现在需要从自定义 UICollectionViewCell 中显示。 present 不再工作,因为 class 是 UICollectionViewCell 而不再是 UIViewController。如何显示自定义 UICollectionViewCell.

中的弹出框
   @IBAction func period(_ sender: Any) {

        let storyboard = UIStoryboard(name: "ScoreClockPopoverViewController", bundle: nil)
        let scoreClockPopoverViewController = storyboard.instantiateViewController(withIdentifier: "ScoreClockPopoverViewController") as! ScoreClockPopoverViewController

        scoreClockPopoverViewController.modalPresentationStyle = .popover

        let popover = scoreClockPopoverViewController.popoverPresentationController!
        popover.delegate = self
        popover.permittedArrowDirections = .any
        popover.sourceView = periodButton
        popover.sourceRect = periodButton.bounds


        present(scoreClockPopoverViewController, animated: true, completion:nil)
       //Error: Use of unresolved identifier 'present'

    }

如果我尝试将 UICollectionViewCell 扩展为 UIViewContoller,我会收到以下错误:Extension of type 'HeaderCollectionViewCell' cannot inherit from class 'UIViewController'

将您的 CollectionViewcontroller 设置为 CollectionViewCell 的代表。

当调用 CollectionViewCell 上的句点函数时,调用单元格委托的 "didClickPeriod" 函数(您自己创建的)。

包括这个,例如在你的手机里

protocol HeaderCollectionViewCellDelegate {
    func didClickPeriod(sender: Any)
}

确保单元格有 属性

var delegate: HeaderCollectionViewCellDelegate!

注意!。假设您从情节提要中实例化,您不能在实例化时传递委托,但必须填充它 "manually"。这 !基本上说明您可以使用此 属性 就好像它始终已设置一样 - 假设您正确填写 属性,这将使您免于一直展开。如果你不这样做,你会收到一个崩溃。

在你的周期函数中只需做

@IBAction func period(_ sender: Any) {
   self.delegate.didClickPeriod(sender)
}

在你的 CollectionViewController 中确保它实现了协议,例如通过包括

extension YourCollectionViewController: HeaderCollectionViewCellDelegate {
    func didClickPeriod(sender: Any) {
        // your previous presentation logic. 
        // But now you're in the CollectionViewController so you can do
       ...
       present(scoreClockPopoverViewController, animated: true, completion:nil)

    }
}