我刚开始用swift编程,我很难理解UIViewController access是如何工作的。
基本上,我有一个UIViewController,它在完成任务后,使用PopToViewController弹出并返回到另一个VC。
我想将回调函数附加到PopToViewController操作,该操作调用位于新的top ViewController上的函数。此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。有什么简单的方法吗?

最佳答案

您的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不是直接父级,那么在到达子级或使用通知之前,您将一直传递委托。

关于ios - 在调用PoptoViewController之后从UIController的顶层堆栈进行回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52010842/

10-12 14:05