Swift - UIAlert在UICollectionViewCell中不起作用

时间:2018-03-13 06:11:55

标签: swift uicollectionview

我正在编写没有故事板的编码,而我现在遇到了这个问题,因为我无法找到一个好的解决方案。

所以我试图从UIAlert拨打UICollectionViewCell,如下所示。

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

这是我在stackoverflow中发现的,它可以工作。

但是ViewController UICollectionViewCell来自ViewController的{​​{1}}如present(_:animated:completion:)所示,UIAlert不会被调用

self.present(HomeController(), animated: true, completion: nil)

是否有人知道此问题的解决方案?

3 个答案:

答案 0 :(得分:1)

不,如果您想要从单元格中点击操作时显示警告,那么您将无法实现委托

 protocol CollectionViewCellDelegate: class {
    func showAlert(_ cell: CollectionViewCell, _ message: String)
 }

 class CollectionViewCell: UICollectionViewCell {
    ...
    ....
    .....

    weak var delegate: CollectionViewCellDelegate?

   @IBAction func yourButtonAction(_ sender: UIButton) {
       self.delegate?.showAlert(self, "your message")
   }
}
在viewController中

该集合的cellforRow

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectioView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell

     ....
     cell.delegate = self
     return cell
}

符合委托

   extension YourClass: CollectionViewCellDelegate {

    func showAlert(_ cell: CollectionViewCell, _ message: String) {

       let alert = UIAlertController(title: "Alert Title", message: "Alert Message", style = .alert)
       alert.addAction(UIAlertAction(title: "title", style: .default, handler: nil)
       self.presentViewController(alert, animated: true, completion: nil)

    }
 }

答案 1 :(得分:1)

您的单元负责呈现警报控制器这一事实并不是一个好的设计,cell应该委托给您。话虽如此,有可能获得cell所在的视图控制器并使用它来呈现警报控制器:

extension UIView {
    var parentController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

在您想要从单元格中呈现控制器的地方:

if let vc = cell.parentController {
    vc.present(// alert controller)
}

答案 2 :(得分:0)

您只能从最顶层的视图控制器出现。我假设您正在尝试从rootViewController呈现警报控制器。如果已经在其上呈现了另一个viewController,则无效。在您的情况下,HomeController

使用HomeController电话在self.present()上展示。不在rootViewController

之上