当我关闭弹出ViewController时,我想在显示的ViewController上调用一个方法。像这样从“ MainViewController”启动Popup :(借助EzPopup Library,但我认为在这里应该没关系)
@IBAction func onStartWorkout(_ sender: UIButton) {
let startWorkoutVC = storyboard!.instantiateViewController(withIdentifier: "CardContent") as! StartWorkout_ViewController
let popupVC = PopupViewController(contentController: startWorkoutVC, popupWidth: 300, popupHeight: 500)
popupVC.cornerRadius = 10
present(popupVC, animated: true)
}
然后当我关闭弹出窗口时,我会这样做:
func dissmissPopup() {
if let presenter = presentingViewController as? MainViewController {
presenter.startWorkout(index: 0, isSNR: true)
}
self.dismiss(animated: true, completion: nil)
}
但是不会调用该方法。 presentingViewController如何工作,为什么我对MainViewController的引用不起作用?
答案 0 :(得分:1)
假设dissmissPopup
在您的StartWorkout_ViewController
班级中,那么presentingViewController
将是nil
,因为您没有在讲StartWorkout_ViewController
,而是在讲PopupViewController
。 presentingViewController
的{{1}}应该是您的PopupViewController
。
根据MainViewController
的编写方式,您应该可以通过访问PopupViewController
(给您parent
,然后访问其PopupViewController
)来获得所需的内容。
presentingViewController
现在,所有这些都不要做。这是一个糟糕的,脆弱的设计。您正在将func dissmissPopup() {
if let presenter = parent?.presentingViewController as? MainViewController {
presenter.startWorkout(index: 0, isSNR: true)
}
self.dismiss(animated: true, completion: nil)
}
需要一些特定方法称为StartWorkout_ViewController
的硬编码。
正确的解决方案是定义协议和委托。然后MainViewController
只需在其委托上调用协议方法(而不管它到底是谁)。并且StartWorkout_ViewController
将自己设置为MainViewController
的委托并实现协议的方法。
这种方法消除了StartWorkout_ViewController
知道是谁展示或如何展示的需求。它消除了StartWorkout_ViewController
知道专门调用名为StartWorkout_ViewController
的方法的需要。它还允许其他类呈现startWorkout
并在被解雇时执行所需的任何操作,而无需对MainViewController
进行进一步的硬编码更改。
以下是使用协议和委托来实现的粗略概述:
StartWorkout_ViewController.swift:
MainViewController
MainViewController.swift:
protocol StartWorkoutDelegate: class {
func complete() // add any necessary parameters
}
class StartWorkout_ViewController: UIViewController {
weak var delegate: StartWorkoutDelegate?
func dissmissPopup() {
delegate?.complete() // add any necessary parameters
self.dismiss(animated: true, completion: nil)
}
}