免费开源的iOS开发学习平台

UIViewController介绍:6-控制器嵌套

控制器嵌套简介

所谓“控制器嵌套”指的就是在一个父控制器上,再添加若干个子控制器,有些功能的实现可以在子控制器的代码中进行实现,同时子控制器与父控制器之间可以使用代理或者通知的方式进行通信,以便实现父子控制器之间的数据交互。

UIViewController类中,对于子控制器提供了一些管理方法,包括:添加子控制器,移除子控制器等,常用方法如下:

  • 获取父控制器对象中所有的子控制器,返回一个数组
@property(nonatomic,readonly) NSArray *childViewControllers ;
  • 添加子控制器
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
  • 移除子控制器
- (void) removeFromParentViewController NS_AVAILABLE_IOS(5_0);

父子控制器之间的通信

父控制器和子控制之间可以建立通信机制,例如:当点击子控制器上的某个按钮时,通知父控制器跳转到一个新的控制器。父子控制器之间的通信方式可以采用如下两种方式:

  • 代理:在子控制器的类中,添加代理属性和代理方法,并在父控制器中实现代理方法;

  • 通知:当子控制器某个事件发生时,需要通知多个对象时,即一对多,也可以采用通知的方式。

示例代码

下方的示例代码中,创建了一个子控制器对象,并且通过操作可以添加到父控制器上,用户看到的界面效果是两个控制器的视图对象叠加后的样式。

  • 自定义一个控制器类--SubViewController类,可以使用代码、XIB或者StoryBoard等方式

  • 在SubViewController.m中,定制子控制器的一些属性,例如,可以设置其控制器视图的frame属性并且添加一张图片
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置子控制器view的属性
    self.view.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height * 0.5, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height * 0.5);
    self.view.backgroundColor = [UIColor greenColor];
    //添加一张图片
    UIImageView *iconImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"99ios"]];
    iconImage.frame = CGRectMake(128, 50, 128, 128);
    [self.view addSubview:iconImage];
    
}
  • 在父控制器类中,添加一个子控制器属性,注意:使用strong关键字,并且实现子控制器的懒加载方法
#import "SubViewController.h"
@interface ViewController () 
@property (nonatomic, strong) SubViewController *subVC;
@end
-(SubViewController *)subVC {
    if (_subVC == nil) {
        _subVC = [[SubViewController alloc] init];
        [self.view addSubview:_subVC.view];
        _subVC.delegate = self;        
    }
    return _subVC;
}
  • 在需要创建子控制器的时候,使用addChildViewController:方法添加子控制器,例如,当点击屏幕时添加子控制器。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self addChildViewController:self.subVC];
}

运行结果如下。初始状态时,父控制器中没有子控制器,屏幕显示的为父控制器view的样式。

当点击屏幕后,添加子控制器,子控制器的视图显示在屏幕下方。

示例代码

https://github.com/99ios/9.1.6