0

我有一个在 中定义的弹出框UIViewController,但现在需要从自定义中呈现UICollectionViewCellpresent不再工作,因为该类是一个并且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'

    }

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

4

1 回答 1

0

将您设置为您CollectionViewcontroller的代表CollectionViewCell

调用 CollectionViewCell 上的 period 函数时,调用单元格委托的“didClickPeriod”函数(您自己创建)。

包括这个,例如在你的单元格中

protocol HeaderCollectionViewCellDelegate {
    func didClickPeriod(sender: Any)
}

确保单元格具有属性

var delegate: HeaderCollectionViewCellDelegate!

注意!。假设您从 Storyboard 实例化,您无法通过您的委托进行实例化,而必须“手动”填写它。这 !基本上表明您可以像始终设置一样使用此属性 - 假设您正确填充属性,这将使您免于一直打开包装。如果你不这样做,你会收到一个崩溃。

在您的 period 函数中,只需执行

@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)

    }
}
于 2017-10-16T15:43:42.763 回答