presentingViewController不起作用

时间:2018-07-11 16:00:42

标签: ios swift

当我关闭弹出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的引用不起作用?

1 个答案:

答案 0 :(得分:1)

假设dissmissPopup在您的StartWorkout_ViewController班级中,那么presentingViewController将是nil,因为您没有在讲StartWorkout_ViewController,而是在讲PopupViewControllerpresentingViewController的{​​{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)
    }
}