Vous pouvez utiliser des fermetures pour envoyer un rappel lorsque quelque chose est terminé. On dirait que ViewControllerA ne devrait rien savoir de ViewControllerC. ViewControllerA ouvre juste ViewControllerB, puis doit recevoir un retour. Voici à quoi il ressemble:
class ViewControllerA: UIViewController {
let viewControllerB = ViewControllerB()
func showViewControllerB() {
viewControllerB.onFinish = {
// work is done in ViewControllerB and C
}
presentViewController(viewControllerB, animated: true, completion: nil)
}
}
Voilà comment regarder ViewControllerB et ViewControllerC comme:
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?()
}
}
Le code ci-dessus montre juste un concept comment vous pouvez réutiliser les fermetures pour callbacks entre contrôleurs de vue.
Le concept est le même si vous utilisez Objective-C. Dans ce cas, les blocs sont utilisés:
@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
Où onFinish
est une propriété de ViewControllerB @property (copy) void (^onFinish)();
Merci beaucoup pour cela, je vais essayer! Et oui, c'est l'objectif C pour moi! – emleeh