携手创造,一起成长!这是我参与「日新计划 8 月更文挑战」的第19天,点击检查活动概况

前语

控制器办理(控制器之间的切换)

  1. 控制器、view的多种创立办法
  2. UINavigationController 的简略运用(增加、移除子控制器)
  3. UINavigationBar内容的设置
  4. 控制器的生命周期

I 控制器常见的创立办法

1.1 经过storyboard创立

  1. 先加载storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
  1. 接着初始化storyboard中的控制器
HMViewController *HM = [storyboard instantiateInitialViewController];//初始化“初始控制器”(箭头所指的控制器)
//经过一个标识初始化对应的控制器
HMViewController *HM = [storyboard instantiateViewControllerWithIdentifier:@”HM"];

1.2 直接创立

HMViewController *hm = [[HMViewController alloc] init];

1.3 指定xib文件来创立

- (void) settingsetRootViewControllerFromXib{
    //    [self.window setRootViewController:[[HSPurpleViewController alloc]initWithNibName:@"HSPurpleView" bundle:nil]];
    /** 假如没有指定xib,就会默许查找HSPurpleView(没有Controller之前的字符串HSPurpleView的xib,接着会查找HSPurpleViewController的xib) ,假如都没找到对应的xib描绘文件,体系就自己创立一个View对象进行展现*/
    [self.window setRootViewController:[[HSPurpleViewController alloc]init]];
}

ps:指定xib文件的fileOwner,以及控制器的View (在xib 界面进行操作)

<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HSPurpleViewController">
            <connections>
                <outlet property="view" destination="iN0-l3-epB" id="fkF-S7-TYo"/>
            </connections>
 </placeholder>

II 创立ViewController的view


iOS小技能:导航控制器(控制器、view的多种创建方式、控制器的生命周期)

p s:父类的loadView 会自动完结上图的右侧逻辑

/** 自定义View  custom view */
#if 1
- (void)loadView{ // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.
//    [super loadView];//父类的loadView 会自动完结上图的右侧逻辑
    //实例化View
    self.view = [[UITableView alloc]init];
    [self.view setBackgroundColor:[UIColor lightGrayColor]];
        NSLog(@"%s",__func__);
}
#endif

iOS小技能:导航控制器(控制器、view的多种创建方式、控制器的生命周期)

2.1 控制器的view是延迟加载的即懒加载

直到第一次拜访view特点时,才会去加载或许创立UIViewController的视图集。


//window要显示到屏幕,有必要设置它为主窗口,并且设置为可见
[self.window makeKeyAndVisible];//Makes the receiver the key window and visible.--这个时分会调用控制器的loadView 办法

1》能够用isViewLoaded办法判别一个UIViewController的view是否现已被加载

2》控制器的view加载结束就会调用viewDidLoad办法

2.2 内存正告处理:

iOS小技能:导航控制器(控制器、view的多种创建方式、控制器的生命周期)

2.3 生命周期办法

iOS小技能:导航控制器(控制器、view的多种创建方式、控制器的生命周期)

众所周知,每一个UIViewController办理着一个由多个视图组成的树形结构,其间根视图保存在UIViewController的view特点中。UIViewController会懒加载它所办理的视图集,直到第一次拜访view特点时,才会去加载或许创立UIViewController的视图集。

  • 几种常用的加载或许创立UIViewController的视图集的办法如下。 运用Storyboard。 运用Nib文件。 运用代码,即重写-loadView

以上这些办法终究都会创立出合适的根视图并保存在UIViewController的view特点中,这是UIViewController生命周期的第一步。当UIViewController的根视图需求展现在页面上时,会调用-viewDidLoad办法。在这个办法中,咱们能够做一些对象初始化相关的工作。

当UIViewController的视图在屏幕上的显示状况发生变化时,UIViewController会自动回调一些办法,以确保子类能够应对这些变化。

iOS小技能:导航控制器(控制器、view的多种创建方式、控制器的生命周期)

UIViewController被毁掉前,还会回调-dealloc办法。咱们一般经过重写该办法来自动开释不能被ARC自动开释的资源。

当履行到-viewDidAppear:办法时,表明视图现已在屏幕上渲染完结,即页面现已显示出来,正等待用户进行下一步操作。因此,履行到-viewDidAppear:办法的时刻点是触发页面阅读事情的最佳时机。假如想要完结页面阅读事情的全埋点,就需求运用iOS的“黑魔法”——Method Swizzling的相关技术

viewDidLoad的调用次序:

需求注意的是,此刻,视图的bounds还没有确认。

  • 假如运用代码创立视图集,-viewDidLoad办法会在-loadView办法调用结束之后运行。

  • 假如运用Stroyboard或许Nib文件创立视图集,-viewDidLoad办法则会在-awakeFromNib办法之后调用。

III 多控制器(用一个控制器去办理其他多个控制器)

为了便于办理控制器,iOS提供了2个比较特殊的控制器:UINavigationController、UITabBarController

四、UINavigationController

运用UINavigationController,能够轻松地办理多个控制器,轻松完结控制器之间的切换,典型例子就是体系自带的“设置”应用。

iOS小技能:导航控制器(控制器、view的多种创建方式、控制器的生命周期)

1、 UINavigationController的简略运用

1》UINavigationController的运用步骤

*初始化UINavigationController

*设置UIWindow的rootViewController为UINavigationController

*根据具体情况,经过push办法增加对应个数的子控制器 2、UINavigationController的子控制器(以栈的形式保存)


/UINavigationController以栈的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
//运用push办法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
//运用pop办法能够移除控制器、将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
//回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
//回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;