在呈现的viewcontroller被解除后调用maincontroller的函数

时间:2018-04-26 15:04:34

标签: ios swift

我有一个呈现viewcontroller的MainViewcontroller。用户可以采取首先应该关闭视图控制器的操作,然后调用MainViewcontroller中定义的函数。

约束是这个函数将创建一个新的vc来呈现。我试过了主控制器的viewWillAppear和viewdidAppear。这不起作用,因为他们不止一次被召唤。

我也可以使用通知机制,但我不确定MainViewController会在收到通知之前出现。

2 个答案:

答案 0 :(得分:1)

你应该看看presentingViewController document。从呈现的视图控制器,您可以使用self.presentingViewController获取MainViewController。试试下面的代码

let mainViewController = self.presentingViewController as! MainViewController

self.dismiss(animated: true) {
  mainViewController.doWhateverYouWant()
}

答案 1 :(得分:0)

特定解决方案

我们说这是你的MainViewController

class MainViewController: UIViewController {

    func foo() {
        print("foo")
    }    
}

您可以像这样声明SecondViewController

class SecondViewController: UIViewController {

    @IBAction func didTapDismiss(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }

    override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
        let mainViewController = self.presentingViewController as? MainViewController
        super.dismiss(animated: flag) {
            mainViewController?.foo()
            completion?()
        }
    }
}

正如您在SecondViewController被解雇时所看到的那样,我们会调用mainViewController?.foo()方法。

一般解决方案

让我们定义MainViewController

class MainViewController: UIViewController {

    typealias CallBack = () -> Void

    func foo() {
        print("foo")
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let mainViewControllerCallbackProtocol = segue.destination as? MainViewControllerCallbackProtocol {
            mainViewControllerCallbackProtocol.mainViewControllerCallback = { [weak self] in
                self?.foo()
            }
        }
    }
}

自己的回调协议

protocol MainViewControllerCallbackProtocol:AnyObject {
    var mainViewControllerCallback: MainViewController.CallBack? { get set }
}

最后,让SecondViewController符合MainViewControllerCallbackProtocol

class SecondViewController: UIViewController, MainViewControllerCallbackProtocol {

    var mainViewControllerCallback: MainViewController.CallBack?

    @IBAction func didTapDismiss(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }

    override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
        super.dismiss(animated: flag) { [weak self] in
            self?.mainViewControllerCallback?()
            completion?()
        }
    }
}