Обратный вызов из верхнего стека UIController после вызова PoptoViewController - PullRequest
0 голосов
/ 24 августа 2018

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

По сути, у меня есть UIViewController, который после завершения своей задачи выскочил с помощью PopToViewController и вернулся в другой VC.

Я хотел присоединить функцию обратного вызова к операции PopToViewController, которая вызывает функцию, расположенную в новом верхнем ViewController. Этот ViewController уже был создан, поэтому я не хочу создавать новый.

В основном то, что у меня сейчас есть, примерно так

class CurrentController: UIViewController {

    @IBAction func onButtonTap() {
        popViewController(animated: true)
        TargetController.dosomething()
    }
}

И целевой контроллер (тот, который я хочу сделать, выполняет функцию)

class TargetController: UIViewCOntroller { 
    func dosomething() { //I want to call this function right after pop happens without instantiating a new class
        //do something
    }
}

Я пробовал некоторые методы доступа, но в основном все они создавали новые экземпляры или возвращали ноль. Есть ли простой способ для этого?

1 Ответ

0 голосов
/ 24 августа 2018

Вам необходимо иметь делегата из TargetController в вашем CurrentController.Затем передайте экземпляр вашего CurrentController этому делегату.Теперь вы можете использовать этот делегат для вызова требуемого метода при вызове CurrentViewController.

class CurrentController: UIViewController {
    var targetViewControllerDelegate: TargetController!

    @IBAction func onButtonTap() {
        CATransaction.begin()
        navigationController?.popViewController(animated: true)
        CATransaction.setCompletionBlock { 
            targetViewControllerDelegate.dosomething() 
        }
        CATransaction.commit()
    }
}

Теперь вам нужно установить делегат в TargetController, когда вы нажимаете контроллер представления.

class TargetController: UIViewController {

    func functionWhereYouPush() {
        let currentViewController = CurrentViewController()
        currentViewController.targetViewControllerDelegate = self
        navigationController?.pushViewController(currentViewController, animated: true)
    } 

    func dosomething() {
        //do something
    }
}

Если вы TargetController не являетесь прямым родителем, вам придется передавать делегатов до достижения ребенка или использовать уведомление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...