Say I have a custom container view controller (MainViewController) where I do something like this:
- (void)viewDidLoad
{
[super viewDidLoad];
There's another way too...
Every view controller has a parentViewController
property so using that you can do this...
In MainViewController
define a method for the action you want to perform...
- (void)someMethod:(BOOL)someParam;
Then in HomeViewController
you can do...
MainViewController* parent = (MainViewController*)[self parentViewController];
[parent someMethod:paramValue];
HTH :)
You can either use delegate or block;
Using delegate
Create a protocol :
@protocol SomeProtocol <NSObject>
- (void)someAction;
@end
Just declare a delegate in HomeViewController.h like this:
id<SomeProtocol> delegate;
and then in MainViewController's viewDidLoad set it like this:
homeVC.delegate = self;
//some where in MainViewController implement the protocol method
-(void)someAction
{
//do something
}
then when you press the button in homeVC, just simply call:
if ([self.delegate respondsToSelector:@selector(someAction)]) {
[self.delegate someAction];
}
Using Block:
In HomeViewController.h declare a block property:
typedef void (^ActionBlock)();
@property (nonatomic, copy) ActionBlock block;
then in MainViewController ViewDidLoad:
homeVC.block = ^(){
//do something
};
then when you press the button in homeVC, just simply call:
self.block();
This is a very common pattern. The parent will be the actual instance that will handle the action, by providing a protocol
and a default extension.
In Swift 3:
Parent view controller:
protocol SomeProtocol {
func foo()
}
extension ParentViewController: SomeProtocol {
func foo() {
// Parent handles it
}
}
Child view controller:
@IBAction func tapGo(_ sender: Any) {
(parent as? SomeProtocol)?.foo()
}