You can use closures to deliver a callback when something is finished. Sounds like ViewControllerA shouldn't know anything about ViewControllerC. ViewControllerA just opens ViewControllerB and then needs to receive a feedback. Here's how it looks:
class ViewControllerA: UIViewController {
let viewControllerB = ViewControllerB()
func showViewControllerB() {
viewControllerB.onFinish = {
// work is done in ViewControllerB and C
}
presentViewController(viewControllerB, animated: true, completion: nil)
}
}
Here's how ViewControllerB and ViewControllerC look like:
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?()
}
}
The code above just shows a concept how you can reuse closures for callbacks between view controllers.
The concept is the same if you use Objective-C. In this case blocks are used:
@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
Where onFinish is a property of ViewControllerB @property (copy) void (^onFinish)();