从UICollectionViewCell呈现AlertView

时间:2015-11-19 05:36:20

标签: ios uibutton uicollectionview uicollectionviewcell uialertcontroller

我的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

有什么想法吗?

3 个答案:

答案 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