Container View Controllers - notify parent of action

删除回忆录丶 提交于 2019-11-30 02:26:14
Eric Qian

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();

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 :)

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()
 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!