8

说我有一个自定义的容器视图控制器(MainViewController),我做这样的事情:容器视图控制器 - 通知动作的母公司

- (void)viewDidLoad 
{ 
    [super viewDidLoad];   

    HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil]; 
    [self addChildViewController:homeVC]; 
    [self.view addSubview:homeVC.view]; 

} 

的HomeViewController将有一个按钮,如“走出去”,即当按下时需要前进到下一个视图控制器。所以我需要通知MainViewController这个动作。做这个的最好方式是什么?

我正在使用自定义容器,因为我需要在视图控制器之间进行自定义转换。当按下“go”时,HomeViewController上的一些视图将生成动画,而来自新视图控制器的视图将生成动画。

很明显,我可以给HomeViewController一个MainViewController类型的属性并以这种方式进行调用,但我希望容器视图控制器API有更简洁的方式。

回答

15

您可以使用委托或块;

使用委托

创建一个协议:

@protocol SomeProtocol <NSObject> 
- (void)someAction; 
@end 

只是声明了一个代表在HomeViewController.h这样的:

id<SomeProtocol> delegate; 

,然后在MainViewController的viewDidLoad设置它像这样:

homeVC.delegate = self; 
//some where in MainViewController implement the protocol method 
-(void)someAction 
{ 
    //do something 
} 

那么当你按下homeVC按钮,只需简单地调用:

if ([self.delegate respondsToSelector:@selector(someAction)]) { 
    [self.delegate someAction]; 
} 

使用块

在HomeViewController.h声明块属性:

typedef void (^ActionBlock)(); 

@property (nonatomic, copy) ActionBlock block; 

然后在MainViewController中ViewDidLoad:

homeVC.block = ^(){ 
    //do something 
}; 

那么当你按下homeVC按钮,只需简单地调用:

self.block(); 
+0

好了,所以没有什么我可以从UIViewController的遏制API利用? – soleil 2013-02-19 22:39:24

+0

不太确定这个帖子可能会帮助[检查此](http://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5) – 2013-02-19 23:00:40

+1

我会+1如果可以的话,这个3倍。它不仅对我回答同样的问题,而且提高了我对块十倍的理解:) – Pedro 2013-08-24 06:44:51

10

有太多的另一种方式...... 每个视图控制器有这么使用,你可以做到这一点...

一个 parentViewController属性

MainViewController定义要执行的操作方法......

- (void)someMethod:(BOOL)someParam; 
HomeViewController

然后你可以做...

MainViewController* parent = (MainViewController*)[self parentViewController]; 
[parent someMethod:paramValue]; 

HTH :)

+2

在这里好快速和肮脏的方式。如果您有更多时间制定协议,请使用选定的答案。谢谢佩德罗! – 2014-10-17 17:09:13

3

这是一个很常见的模式。父母将通过提供和default extension来处理该操作的实际实例。

在斯威夫特3:

父视图控制器:

protocol SomeProtocol { 
    func foo() 
} 

extension ParentViewController: SomeProtocol { 
    func foo() { 
     // Parent handles it 
    } 
} 

儿童视图控制器:

@IBAction func tapGo(_ sender: Any) { 
    (parent as? SomeProtocol)?.foo() 
} 
+0

非常感谢,这正是我一直在寻找的:) – mic 2017-03-17 09:48:51

相关问题