我有一个呈现viewcontroller的MainViewcontroller。用户可以采取首先应该关闭视图控制器的操作,然后调用MainViewcontroller中定义的函数。
约束是这个函数将创建一个新的vc来呈现。我试过了主控制器的viewWillAppear和viewdidAppear。这不起作用,因为他们不止一次被召唤。
我也可以使用通知机制,但我不确定MainViewController会在收到通知之前出现。
答案 0 :(得分:1)
你应该看看presentingViewController document。从呈现的视图控制器,您可以使用self.presentingViewController
获取MainViewController。试试下面的代码
let mainViewController = self.presentingViewController as! MainViewController
self.dismiss(animated: true) {
mainViewController.doWhateverYouWant()
}
答案 1 :(得分:0)
我们说这是你的MainViewController
class MainViewController: UIViewController {
func foo() {
print("foo")
}
}
您可以像这样声明SecondViewController
class SecondViewController: UIViewController {
@IBAction func didTapDismiss(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
let mainViewController = self.presentingViewController as? MainViewController
super.dismiss(animated: flag) {
mainViewController?.foo()
completion?()
}
}
}
正如您在SecondViewController
被解雇时所看到的那样,我们会调用mainViewController?.foo()
方法。
让我们定义MainViewController
class MainViewController: UIViewController {
typealias CallBack = () -> Void
func foo() {
print("foo")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let mainViewControllerCallbackProtocol = segue.destination as? MainViewControllerCallbackProtocol {
mainViewControllerCallbackProtocol.mainViewControllerCallback = { [weak self] in
self?.foo()
}
}
}
}
自己的回调协议
protocol MainViewControllerCallbackProtocol:AnyObject {
var mainViewControllerCallback: MainViewController.CallBack? { get set }
}
最后,让SecondViewController
符合MainViewControllerCallbackProtocol
class SecondViewController: UIViewController, MainViewControllerCallbackProtocol {
var mainViewControllerCallback: MainViewController.CallBack?
@IBAction func didTapDismiss(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag) { [weak self] in
self?.mainViewControllerCallback?()
completion?()
}
}
}