我刚开始用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/