我正在编写没有故事板的编码,而我现在遇到了这个问题,因为我无法找到一个好的解决方案。
所以我试图从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)
是否有人知道此问题的解决方案?
答案 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