如何从自定义 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)
}
}
我有一个在 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)
}
}