当某事完成时,您可以使用闭包来传递回调。听起来 ViewControllerA 不应该对 ViewControllerC 有任何了解。 ViewControllerA 只是打开 ViewControllerB 然后需要接收反馈。下面是它的外观:
class ViewControllerA: UIViewController {
let viewControllerB = ViewControllerB()
func showViewControllerB() {
viewControllerB.onFinish = {
// work is done in ViewControllerB and C
}
presentViewController(viewControllerB, animated: true, completion: nil)
}
}
ViewControllerB 和 ViewControllerC 如下所示:
class ViewControllerB: UIViewController {
var onFinish: (() -> ())?
let viewControllerC = ViewControllerC()
override func viewDidLoad() {
super.viewDidLoad()
viewControllerC.onFinish = { [weak self] in
self?.onFinish?()
}
}
func showViewControllerC() {
presentViewController(viewControllerC, animated: true, completion: nil)
}
}
class ViewControllerC: UIViewController {
var onFinish:(() -> ())?
func didFinishDoSomething() {
onFinish?()
}
}
上面的代码只是展示了如何在视图控制器之间为回调重用闭包的概念。
如果你使用 Objective-C,这个概念是一样的。在这种情况下使用块:
@interface ViewControllerA: UIViewController
@property (strong) ViewControllerB *viewControllerB;
@end
@implementation ViewControllerA
- (void)viewDidLoad {
[super viewDidLoad];
self.viewControllerB.onFinish = ^{
// work is done in both VC B and VC C
};
}
- (void)showViewControllerB {
[self presentViewController:self.viewControllerB animated:YES completion:nil];
}
@end
其中onFinish 是 ViewControllerB @property (copy) void (^onFinish)(); 的一个属性