在调用PoptoViewController之后从UIController的顶层堆栈进行回调

时间:2018-08-24 19:46:25

标签: ios swift uiviewcontroller

我刚刚开始快速编程,我正在努力了解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
    }
}

我尝试了一些访问方法,但大多数方法都创建了新实例或返回nil。有什么简单的方法吗?

1 个答案:

答案 0 :(得分:0)

您需要在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的直接父代,那么您将不断传递委托,直到您到达孩子为止,或使用通知。