我刚刚开始快速编程,我正在努力了解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。有什么简单的方法吗?
答案 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的直接父代,那么您将不断传递委托,直到您到达孩子为止,或使用通知。