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"http://分類控制器
#import "BrandViewController.h"http://品牌控制器
@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;
//如果分類控制器不存在就創(chuàng)建一個新的分類控制器:
if (!self.sortVc) {
self.sortVc = [[SortViewController alloc] init];
}
//給容器控制器添加子控制器(剛剛創(chuàng)建的這個分類控制器), 這個新創(chuàng)建的分類控制器就放在容器控制器上面:
//并且這個新創(chuàng)建的子控制器(分類控制器)的 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;
//如果品牌控制器沒有創(chuàng)建我就重新創(chuàng)建一個:
if (!self.brandVc) {
self.brandVc = [[BrandViewController alloc] init];
}
//給容器控制器添加子控制器(剛剛創(chuàng)建的這個品牌控制器), 這個新創(chuàng)建的品牌控制器就放在容器控制器上面:
//并且這個新創(chuàng)建的子控制器(品牌控制器)的 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];
//新創(chuàng)建的子控制器的大小就是self.coontainerView的大小:
vc.view.frame = view.bounds;
[view addSubview:vc.view];
//最后 通知系統(tǒng)包含關系的變更:
if (needAddToParent) [vc didMoveToParentViewController:self];
}
#pragma mark - 刪除子控制器
- (void)removeChildVc:(UIViewController*)vc {
//一開始 通知系統(tǒng)包含關系的變更:
[vc willMoveToParentViewController:nil];
//如果控制器尚未載入控制器視圖:
if (![vc isViewLoaded]) {
//就只需要刪除控制器就行了:
[vc removeFromParentViewController];
}
else {//如果控制器已經載入了視圖:
//刪除已載入控制器的視圖:
[vc.view removeFromSuperview];
//再刪除該已載入控制器:
[vc removeFromParentViewController];
}
}
@end