Как представить popoverPresentationController из пользовательского UICollectionViewCell NIB

У меня есть поповер, который был определен в UIViewController, но теперь нужно представить из кастома UICollectionViewCell, present больше не работает, так как класс 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'

1 ответ

Решение

Установите свой CollectionViewcontroller как делегат вашего CollectionViewCell,

Когда вызывается функция period в вашем CollectionViewCell, вызовите функцию didClickPeriod (которую вы создаете сами) делегата ячейки.

Включите это, например, в свою клетку

protocol HeaderCollectionViewCellDelegate {
    func didClickPeriod(sender: Any)
}

убедитесь, что ячейка имеет свойство

var delegate: HeaderCollectionViewCellDelegate!

Обратите внимание! Предполагая, что вы создаете экземпляр из Storyboard, вы не можете передать свой делегат при создании экземпляра, но должны заполнить его "вручную".! в основном говорится, что вы можете работать с этим свойством, как если бы оно всегда было установлено - при условии, что вы правильно заполняете свойство, это избавит вас от распаковки все время. Если вы этого не сделаете, вы получите сбой.

В твоем периоде функцию просто делай

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

    }
}
Другие вопросы по тегам