Как представить 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)
}
}