sol*_*eil 8 uiviewcontroller parentviewcontroller ios childviewcontroller
假设我有一个自定义容器视图控制器(MainViewController),我在这里执行以下操作:
- (void)viewDidLoad
{
[super viewDidLoad];
HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
[self addChildViewController:homeVC];
[self.view addSubview:homeVC.view];
}
Run Code Online (Sandbox Code Playgroud)
HomeViewController将有一个按钮,例如"go",按下时需要前进到下一个视图控制器.所以我需要通知MainViewController这个动作.做这个的最好方式是什么?
我正在使用自定义容器,因为我需要在视图控制器之间进行自定义转换.当按下"go"时,HomeViewController上的一些视图将动画,而新视图控制器的视图将动画到位.
显然,我可以给HomeViewController一个MainViewController类型的属性,并以这种方式进行调用,但我希望有一个更简洁的方法与容器视图控制器API.
Eri*_*ian 15
你可以使用委托或阻止;
使用委托
创建协议:
@protocol SomeProtocol <NSObject>
- (void)someAction;
@end
Run Code Online (Sandbox Code Playgroud)
只需在HomeViewController.h中声明一个委托,如下所示:
id<SomeProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)
然后在MainViewController的viewDidLoad中设置如下:
homeVC.delegate = self;
//some where in MainViewController implement the protocol method
-(void)someAction
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
然后当您按homeVC中的按钮时,只需调用:
if ([self.delegate respondsToSelector:@selector(someAction)]) {
[self.delegate someAction];
}
Run Code Online (Sandbox Code Playgroud)
使用块:
在HomeViewController.h中声明一个块属性:
typedef void (^ActionBlock)();
@property (nonatomic, copy) ActionBlock block;
Run Code Online (Sandbox Code Playgroud)
然后在MainViewController ViewDidLoad中:
homeVC.block = ^(){
//do something
};
Run Code Online (Sandbox Code Playgroud)
然后当您按homeVC中的按钮时,只需调用:
self.block();
Run Code Online (Sandbox Code Playgroud)
Ped*_*dro 10
还有另一种方式......每个视图控制器都有一个parentViewController属性,所以使用它可以做到这一点......
在MainViewController定义要执行的操作的方法时...
- (void)someMethod:(BOOL)someParam;
Run Code Online (Sandbox Code Playgroud)
然后在HomeViewController你可以做...
MainViewController* parent = (MainViewController*)[self parentViewController];
[parent someMethod:paramValue];
Run Code Online (Sandbox Code Playgroud)
HTH :)
这是一种非常常见的模式.通过提供protocol和默认扩展,父将是将处理操作的实际实例.
在Swift 3中:
父视图控制器:
protocol SomeProtocol {
func foo()
}
extension ParentViewController: SomeProtocol {
func foo() {
// Parent handles it
}
}
Run Code Online (Sandbox Code Playgroud)
子视图控制器:
@IBAction func tapGo(_ sender: Any) {
(parent as? SomeProtocol)?.foo()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7853 次 |
| 最近记录: |