1

我在我的UICollectionViewCell.swift中有一個按鈕:我想根據某些參數爲它提供警報。從UICollectionViewCell提供AlertView

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

任何想法?

回答

2

集合視圖單元格不應依賴於其父視圖或視圖控制器的知識,以便維護作爲正確應用程序體系結構一部分的職責的功能分離。

因此,要使單元採用顯示警告的行爲,可以使用委託模式。這是通過將協議添加到具有集合視圖的視圖控制器來完成的。

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

警報將被集合視圖控制器上呈現,因爲它已經被設置爲集合視圖的委託細胞。

+0

喜@Danielž - 你的解釋表示感謝。我在'CollectionView'的'import'語句的正下方添加了'@protocol ...'。然後我將'CollectionViewDelegate'添加到'CollectionViewCell'類中......將委託屬性添加到'CollectionViewCell'(不會讓我變弱)。將'showAlert'移至視圖控制器。在'cellForItem'中分配委託,並用'delegate'在單元格中調用alert – SamYoungNY

+0

我收到一個錯誤「類型'CollectionViewCell'不符合協議CollectionViewDelegate」打開此說...「協議需要函數'showAert(0'與類型'() - >()'... – SamYoungNY

+0

我做了一個幾個更正到我的答案協議需要有類註釋讓委託屬性弱,而且它是你的視圖控制器將符合協議,從而提供單元格將使用的showAlert功能。關於讓細胞符合協議。 – Daniel

0

對我來說,它發生在本發明的方法有一點區別:

self.window?.rootViewController?.present(alert, animated: true, completion: nil)