携手创造,一起成长!这是我参与「日新计划 8 月更文挑战」的第19天,点击检查活动概况
前语
控制器办理(控制器之间的切换)
- 控制器、view的多种创立办法
- UINavigationController 的简略运用(增加、移除子控制器)
- UINavigationBar内容的设置
- 控制器的生命周期
I 控制器常见的创立办法
1.1 经过storyboard创立
- 先加载storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
- 接着初始化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
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
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 内存正告处理:
2.3 生命周期办法
众所周知,每一个UIViewController办理着一个由多个视图组成的树形结构,其间根视图保存在UIViewController的view特点中。UIViewController会懒加载它所办理的视图集,直到第一次拜访view特点时,才会去加载或许创立UIViewController的视图集。
- 几种常用的加载或许创立UIViewController的视图集的办法如下。
运用Storyboard。
运用Nib文件。
运用代码,即重写-
loadView
。
以上这些办法终究都会创立出合适的根视图并保存在UIViewController的view特点中,这是UIViewController生命周期的第一步。当UIViewController的根视图需求展现在页面上时,会调用-viewDidLoad办法。在这个办法中,咱们能够做一些对象初始化相关的工作。
当UIViewController的视图在屏幕上的显示状况发生变化时,UIViewController会自动回调一些办法,以确保子类能够应对这些变化。
UIViewController被毁掉前,还会回调-dealloc办法。咱们一般经过重写该办法来自动开释不能被ARC自动开释的资源。
当履行到-viewDidAppear:办法时,表明视图现已在屏幕上渲染完结,即页面现已显示出来,正等待用户进行下一步操作。因此,履行到-viewDidAppear:办法的时刻点是触发页面阅读事情的最佳时机。假如想要完结页面阅读事情的全埋点,
就需求运用iOS的“黑魔法”——Method Swizzling的相关技术
viewDidLoad的调用次序
:
需求注意的是,此刻,视图的bounds还没有确认。
-
假如运用代码创立视图集,-viewDidLoad办法会在-loadView办法调用结束之后运行。
-
假如运用Stroyboard或许Nib文件创立视图集,-viewDidLoad办法则会在-awakeFromNib办法之后调用。
III 多控制器(用一个控制器去办理其他多个控制器)
为了便于办理控制器,iOS提供了2个比较特殊的控制器:UINavigationController、UITabBarController
四、UINavigationController
运用UINavigationController,能够轻松地办理多个控制器,轻松完结控制器之间的切换,典型例子就是体系自带的“设置”应用。
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;