美文网首页
iOS开发之父子控制器以及传值为nil解决

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

作者: 朱晓晓的技术博客 | 来源:发表于2016-12-16 15:54 被阅读1041次

关乎父子控制器,多数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

相关文章

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

    关乎父子控制器,多数APP都采用了类似方式,原理是将多个子控制器存放在大的父级控制器里边,通过滑动或者点击,将制定...

  • ios开发之代理,block,通知

    ios开发中控制器与控制器之间的传值与联系,使用最多的是block,代理,通知.那么他们之间有什么区别以及怎么使用...

  • iOS开发逆向传值的6种方式

    ios开发逆向传值的几种方法整理 1.代理传值 第二个控制器: 第一个控制器: 2.通知传值 第一个控制器: 第二...

  • iOS 父子控制器

    父子控制器 在 iOS 开发中我们经常用到的两大父子控制器分别是:UINavigationController 和...

  • iOS中的传值方式

    在日常开发过程中,我们经常会遇到值传递。这里,介绍几种iOS开发中常见的传值方式。 1.属性传值 属性传值是iOS...

  • 2018-09-22 vue初学8.1(非父子间的传值)

    非父子间的传值也可以理解为同级之间的传值 在非父子传值中主要声明了一个:var 变量 = new Vue(); ...

  • iOS开发对象判空

    iOS 开发之对象为空的判断(nil、null)详解 在开发中,会遇到很多空的情况,有时候取得对象(null),还...

  • vue 父子组件传值 $on sync v-model

    1、正常的父子组件传值2、使用sync 实现父子组件传值3、使用v-model实现父子组件传值

  • Vue父子组件通信和双向绑定

    本篇文章主要介绍父子组件传值,组件的数据双向绑定。 1. 基础父子组件传值 父子组件传值,这是Vue组件传值最常见...

  • iOS 常用传值方式

    总结 iOS 日常开发中的几种常用传值方式:正向传值代理传值block传值通知传值单例 文章代码:https://...

网友评论

      本文标题:iOS开发之父子控制器以及传值为nil解决

      本文链接:https://www.haomeiwen.com/subject/vfbnmttx.html