вызывать функцию главного контроллера после того, как представленный viewcontroller отклонен - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть MainViewcontroller, который представляет viewcontroller. Пользователь может предпринять действие, которое, во-первых, должно закрыть контроллер представления, а во-вторых, вызвать функцию, определенную в MainViewcontroller.

Ограничением является то, что эта функция создаст новый vc для представления. Я пробовал viewWillAppear и viewdidAppear основного контроллера. Это не сработало, потому что они называются более одного раза.

Я также мог бы использовать механизм уведомлений, но я не уверен, что MainViewController появится до получения уведомления.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Конкретное решение

Допустим, это ваш 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?()
        }
    }
}
0 голосов
/ 26 апреля 2018

Вам следует взглянуть на presentViewController document . Из представленного контроллера представления вы можете получить MainViewController, используя self.presentingViewController. Попробуйте мой код ниже

let mainViewController = self.presentingViewController as! MainViewController

self.dismiss(animated: true) {
  mainViewController.doWhateverYouWant()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...