自定义容器视图控制器

Demo演稿Gif图

Demo演稿Gif图.gif

视图层级结构

视图层级结构

NavViewController.h文件

#import "NavViewController.h"
#import "CustomContainerViewController.h"

@interface NavViewController ()

@end

@implementation NavViewController

#pragma mark - 初始化方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    
    if (self) {
        CustomContainerViewController *parent = [[CustomContainerViewController alloc] init];
        //自定义容器控制器放入导航控制器中:
        self.viewControllers = @[ parent ];
    }
    return self;
}


- (void)viewDidLoad {
    [super viewDidLoad];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}


@end

CustomContainerViewController.h文件

#import <UIKit/UIKit.h>

@interface CustomContainerViewController : UIViewController

// 容器视图
@property (nonatomic, weak) IBOutlet UIView *containerView;

@property (nonatomic, weak) IBOutlet UIView *sortHintView;

@property (nonatomic, weak) IBOutlet UIView *brandHintView;

- (IBAction)clickSortBtn:(id)sender;

- (IBAction)clickBrandBtn:(id)sender;

@end

CustomContainerViewController.m文件

#import "CustomContainerViewController.h"
#import "SortViewController.h"//分类控制器
#import "BrandViewController.h"//品牌控制器

@interface CustomContainerViewController ()
//全局分类控制器对象:
@property (nonatomic, strong) SortViewController *sortVc;
//全局品牌控制器对象:
@property (nonatomic, strong) BrandViewController *brandVc;

@end

@implementation CustomContainerViewController

#pragma mark - lifeCycle
- (void)viewDidLoad {
    [super viewDidLoad];
    //一上来就处于分类控制器栏:
    [self changeToSortVc];
}

#pragma mark - 点击 "分类" 按钮方法
- (IBAction)clickSortBtn:(id)sender {
    [self changeToSortVc];
}

#pragma mark - 点击 "品牌" 按钮方法
- (IBAction)clickBrandBtn:(id)sender {
    [self changeToBrandVc];
}


#pragma mark - 跳转到"分类"控制器
- (void)changeToSortVc {
    //先去除掉品牌控制器:
    if (self.brandVc) {
        [self removeChildVc:self.brandVc];
    }
    //品牌横线隐藏:
    self.brandHintView.hidden = YES;
    //如果分类控制器不存在就创建一个新的分类控制器:
    if (!self.sortVc) {
        self.sortVc = [[SortViewController alloc] init];
    }
    //给容器控制器添加子控制器(刚刚创建的这个分类控制器), 这个新创建的分类控制器就放在容器控制器上面:
    //并且这个新创建的子控制器(分类控制器)的 view 视图放置在 self.containerView 上:
    [self addChildVc:self.sortVc view:self.containerView];
    //同时显示分类横线:
    self.sortHintView.hidden = NO;
}

#pragma mark - 跳转到"品牌"控制器
- (void)changeToBrandVc {
    //如果有分类控制器存在就先删除这个分类控制器:
    if (self.sortVc) {
        [self removeChildVc:self.sortVc];
    }
    self.sortHintView.hidden = YES;
    //如果品牌控制器没有创建我就重新创建一个:
    if (!self.brandVc) {
        self.brandVc = [[BrandViewController alloc] init];
    }
    //给容器控制器添加子控制器(刚刚创建的这个品牌控制器), 这个新创建的品牌控制器就放在容器控制器上面:
    //并且这个新创建的子控制器(品牌控制器)的 view 视图放置在 self.containerView 上:
    [self addChildVc:self.brandVc view:self.containerView];
    //同时显示品牌横线:
    self.brandHintView.hidden = NO;
}


#pragma mark - Add / Remove Child vc
- (void)addChildVc:(UIViewController*)vc
{
    [self addChildVc:vc view:self.view];
}


#pragma mark - 添加子控制器
- (void)addChildVc:(UIViewController*)vc view:(UIView *)view {
    //定义布尔值: needAddToParent == YES 意味着子控制器没有父控制器:
    BOOL needAddToParent = !vc.parentViewController;
    //如果 传进来的这个控制器 没有 父控制器, 那么我就把 该控制器 作为 自定义视图控制器 的子控制器:
    if (needAddToParent) [self addChildViewController:vc];
    //新创建的子控制器的大小就是self.coontainerView的大小:
    vc.view.frame = view.bounds;
    [view addSubview:vc.view];
    //最后 通知系统包含关系的变更:
    if (needAddToParent) [vc didMoveToParentViewController:self];
}


#pragma mark - 删除子控制器
- (void)removeChildVc:(UIViewController*)vc {
    //一开始 通知系统包含关系的变更:
    [vc willMoveToParentViewController:nil];
    //如果控制器尚未载入控制器视图:
    if (![vc isViewLoaded]) {
        //就只需要删除控制器就行了:
        [vc removeFromParentViewController];
    }
    else {//如果控制器已经载入了视图:
        //删除已载入控制器的视图:
        [vc.view removeFromSuperview];
        //再删除该已载入控制器:
        [vc removeFromParentViewController];
    }
}

@end

愿编程让这个世界更美好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,977评论 4 60
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,260评论 25 707
  • 什么事情都要有分寸。很多人分寸拿捏不当,总无所顾忌,势必遭人厌恶。 中国人一直很讲究一个“度”,常说的过犹不及...
    颢宁斋阅读 1,248评论 1 12
  • 办公室里大家说起了许多老师的孩子参加工作的事,结婚生子的事。时间过的真快,进实小那年,那些孩子都还在读小学,如今都...
    独孤草原狼阅读 154评论 0 0