我的UICollectionViewCell.swift中有一个按钮:我希望,根据某些参数,它能够呈现警报。
class CollectionViewCell: UICollectionViewCell {
var collectionView: CollectionView!
@IBAction func buttonPressed(sender: UIButton) {
doThisOrThat()
}
func doThisOrThat() {
if x == .NotDetermined {
y.doSomething()
} else if x == .Denied || x == .Restricted {
showAlert("Error", theMessage: "there's an error here")
return
}
}
func showAlert(title: String, theMessage: String) {
let alert = UIAlertController(title: title, message: theMessage, preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
self.collectionView!.presentViewController(alert, animated: true, completion: nil)
}
在self.collectionView!.presentViewController
行,我休息一下:
fatal error: unexpectedly found nil while unwrapping an Optional value
我猜这与CollectionView
的使用方式有关 - 我还不完全理解选项。我知道UICollectionCell
无法.presentViewController
- 这就是为什么我要让UICOllectionView
来做这件事。
如何使这项工作?我曾考虑使用extension
,但不知道如何让UICOllectionViewCell
采用.presentViewController
有什么想法吗?
答案 0 :(得分:6)
集合视图单元不应依赖于其父视图或视图控制器的知识,以便维护作为正确应用程序体系结构一部分的职责的功能分离。
因此,为了使单元格采用显示警报的行为,可以使用委托模式。这是通过向具有集合视图的视图控制器添加协议来完成的。
@protocol CollectionViewCellDelegate: class {
func showAlert()
}
让视图控制器符合该协议:
class MyViewController: UIViewController, CollectionViewCellDelegate {
还向单元格添加委托属性:
weak var delegate: CollectionViewCellDelegate?
将showAlert()
函数移动到集合视图控制器中。
创建单元格时,将单元格的委托指定给集合视图控制器。
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
// Other cell code here.
cell.delegate = self
当需要显示提醒时,请进行小区呼叫
delegate.showAlert()
然后,警报将显示在集合视图控制器上,因为它已被设置为集合视图单元的委托。
答案 1 :(得分:3)
对我来说,现有方法有点不同:
self.window?.rootViewController?.present(alert, animated: true, completion: nil)
答案 2 :(得分:2)
self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
您可以使用父控制器的类。请upvote其他帖子。 (摘自How to present an AlertView from a UICollectionViewCell)