Вы можете использовать блокировки для доставки обратного вызова, когда что-то будет завершено. Похоже, что 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)();
Большое вам спасибо за это, я попытаюсь это! И да, это Objective C для меня! – emleeh