iOS开发之父子控制器以及传值为nil解决

关乎父子控制器,多数APP都采用了类似方式,原理是将多个子控制器存放在大的父级控制器里边,通过滑动或者点击,将制定的子控制器显示在当前的UIWindows上,代表性的有今日头条,网易新闻等.

今日头条将"国际"/"段子"/"趣图"/"财经"等子控制器塞在了当前的控制器,并呈现给读者

请注意绿色部分

实现步骤

1.确定好目录结构
Paste_Image.png
2.在父控制器中实现方法
Paste_Image.png
Paste_Image.png

主要代码


#import "ViewController.h"
#import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h"
@interface ViewController ()

//当前控制器
@property (nonatomic, weak) UIViewController *currentVC;

//子控制器1
@property (nonatomic,strong)OneViewController *oneVc;
//子控制器2
@property (nonatomic,strong)TwoViewController *twoVc;
//子控制器3
@property (nonatomic,strong)ThreeViewController *threeVc;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.oneVc = [[OneViewController alloc]init];
    self.twoVc = [[TwoViewController alloc]init];
    self.threeVc = [[ThreeViewController alloc]init];
    
    //先后顺序不要搞混,那个拍前边就写前边
    [self addChildViewController:self.oneVc];
    [self addChildViewController:self.twoVc];
    [self addChildViewController:self.threeVc];
    
    
    //默认选择第一个子控制器
    [self clickMenu:nil];
}

- (IBAction)clickMenu:(UIButton *)btn {
    // 取出选中的这个控制器
    
    //写法一:
    //UIViewController *oneVc = self.childViewControllers[0];
    
    //写法二:
    self.oneVc = (OneViewController *)self.childViewControllers[0];
    // 设置尺寸位置
    self.oneVc.view.frame = CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height - 50);
    // 移除掉当前显示的控制器的view(移除的是view,而不是控制器)
    [self.currentVC.view removeFromSuperview];
    // 把选中的控制器view显示到界面上
    [self.view addSubview:self.oneVc.view];
    self.currentVC = self.oneVc;
}
3.传值为nil解决方法
Paste_Image.png

简单的说,只要涉及到取值,全部使用写法二的方式,就可以避免传值为nil,否则项目跟block联合调用,就无法分清是block循环导致传值为nil,还是因为控制器无法明晰主从关系导致的传值为nil,这一点切记.

demo下载:
https://github.com/OwenJoe/ParentChildController

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容