内容概要:
一、Application(应用程序管理)
二、加载自定义控制器
三、3种创建控制器的方式
四、UINavigation(导航控制器)
一、Application(应用程序)
1.1—> Application的创建与使用
1.2—> 应用程序启动的原理
1.3—>AppDelegate对象介绍
1.1-Application的创建与使用
①如何获取(创建Application)
②如何使用(管理哪些内容?)
Application是UIApplication类的对象,本身是对应用程序做相应的管理,例如:推送消息时显示的条数,或用户使用时出现的联网指示器 网络不好的时候给用户提示等。
1、如何获取到这个对象——通过类名创建
可以通过sharedApplication进行获取通过这种方式获的对象都是单例对象,任何时候在创建都是同一个。
UIApplication*app = [UIApplicationsharedApplication];
2、Application的应用场景
1)通过UIapplication的对象调整用户联网指示器的出现(创建按钮响应机制来调用测试)
//如果可见,隐藏否则显示
if(app.isNetworkActivityIndicatorVisible) {
app.networkActivityIndicatorVisible=NO;//隐藏
}else{
app.networkActivityIndicatorVisible=YES;//出现
}
2)通过应用程序设置图标上显示数字
app.applicationIconBadgeNumber= 10;//返回的是int类型的数据
//在iOS8以后,我们在给应用头像上设置数字之前必须得先注册个用户通知,使用-[UIApplication registerUserNotificationSettings:]方法进行设置。
流程为:
UIUserNotificationCategory*category= [[UIUserNotificationCategoryalloc]init];
//集合
NSSet*set= [NSSetsetWithObject:category];
UIUserNotificationSettings*settings= [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeBadgecategories:set];
//注册通知
[app registerUserNotificationSettings:settings];
app.applicationIconBadgeNumber=100;
3)应用程序状态栏的设置:
两种方式
1、原来的样式
//原来的方式
- (UIStatusBarStyle)preferredStatusBarStyle
//隐藏方法
- (BOOL)prefersStatusBarHidden;
2、UI进阶阶段后使用另外一种方式
应用程序状态栏的的设置,通过应用程序对象统一设置状态栏
注意:需要到Info.plist文件中增加一个key.在最后一个增加一行选择View controller-based status bar appearance 设置NO 接下来就用应用程序管理状态栏
app1.statusBarHidden=YES;//隐藏
app1.statusBarStyle=UIStatusBarStyleLightContent;// 变亮
1.2 应用程序启动的原理:
①启动的原理是什么?
②main.m里的四个参数是什么
所有程序的入口在Main.m文件中:
intmain(intargc,char* argv[]) {
@autoreleasepool{
returnUIApplicationMain(①argc, ②argv, ③nil, ④NSStringFromClass([AppDelegateclass]));
}
}
explain:
1)入口,main.m文件中的main函数
2)在Main函数中,做了以下事情:
- 先创建自动释放池,将来应用的所有操作都是在自动释放内部操作的.应用销毁的时候直接释放自动释放池
- 调用 UIApplicationMain 函数,并返回.返回值为int类型
Even though an integer return type is specified, this function never returns.
注意:虽然定义了返回值类型,但是这个函数应用不会返回.
这样的现象被称为:死循环. 运行循环,或消息循环.保证能够接收并处理用户的所有操作.
3)四个参数:①②③④(参考上面的代码)
第一/第二是系统提供,我们不需要参与
③ :nil. 要求填写字符串,内容为UIApplication类或其子类的类型名称[calss Name]
④: delegateClassName 代理类的类名
根据第三个参数,创建的应用程序对象.也就是通过sharedApplication获取的那个单例.
根据第四个参数,创建一个AppDelegate类型的一个对象TSL,并且将此对象TSL作为应用程序对象的代理.
4)将应用程序代理对象中的window.实例化出来,作为应用程序的主窗口keyWindow.
5)根据在配置文件中默认加载的storyboard文件 Main ,加载文件,并且将其中带箭头的 控制器 实例化 出来,并且设置为窗口的根控制器.实现界面展示.
1.3 AppDelegate对象介绍
①启动后的原理是什么(一直在等待用户操作)
②appdeleaget.m文件中协议方法的含义【掌握】
③注意点:
引入UIWindow
在学习之前看看一下AppDelegate.m文件中的方法作用
1、//加载完成
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:
2、//取消活跃状态,失去焦点
- (void)applicationWillResignActive:(UIApplication*)application
3、//已经进入后台
- (void)applicationDidEnterBackground:(UIApplication*)application
4、//将要进入前台
- (void)applicationWillEnterForeground:(UIApplication*)application
5、//已经成为活跃状态
- (void)applicationDidBecomeActive:(UIApplication*)application
6、//将要销毁
- (void)applicationWillTerminate:(UIApplication*)application
附加————————————
7、//接收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application
在执行动作中的顺序:
用户操作的行为 | AppDelegate.m文件的响应过程 |
---|---|
点击应用启动 | ①应用加载完成didFinish……②应用已经成为活跃状态DidBecome…… |
点击home键 | 取消活跃状态,失去焦点WillResignActive……已经进入后台DidEnterBackground…… |
再次显示程序 | 应用将要进入前台WillEnterForeground……应用已经成为活跃状态DidBecomeActive…… |
销毁程序-直接销毁 | 已经进入后台DidEnterBackground……已经进入后台DidEnterBackground…… |
间接销毁先进入后台 | 取消活跃状态,失去焦点WillResignActive……已经进入后台DidEnterBackground…… |
过会再销毁【注意点】 | 不会再调用应用即将销毁的方法 |
二、自定义控制器
2.1—>加载自定义控制器
2.2—>控制器view的懒加载
2.3—>手动创建UIWindow
2.1加载自定义控制器的方法:
①需要准备做什么?
②步骤?
什么是自定义控制器:创建自己的控制器继承系统的某一个控制器!
纯代码的方式:
准备工作
删除系统自带的内容
- ViewController.h /.m两个文件 /Main.storyboard文件
- 删除配置文件中默认要加载的storyboard文件名称的Main
代码创建步骤
1、先要有自定义控制器创建一个类,继承自UIViewController
2、需要在应用程序启动完毕后的方法里面执行自己的操作(didFinishLaunching)引入头文件
1> 需要先实例化AppDelegate.h文件中的窗口,窗口的大小就是屏幕的大小(也可以直接alloc init)
self.window= [[UIWindowalloc]initWithFrame:[UIScreenmainScreen].bounds];
2> 创建自定义的控制器对象
MODViewController*MoVc = [[HMViewControlleralloc]init];
3> 将自定义的控制器对象作为窗口的根控制器(第一屏幕)
self.window.rootViewController= MoVc;
4> 将窗口作为应用程序对象的主窗口并可见.
[self.windowmakeKeyAndVisible];
c、回到UIViewController控制器里面添加背景色,就可以看见自定义控制器了。
self.view.backgroundColor= [UIColororangeColor];
2.2关于控制器view的懒加载:
①懒加载会调用view的什么方法?
②什么时候会调用这个方法??
1)懒加载的目的是,用的时候才会调用,只加载一次
2)在使用控制器的视图view时,如果控制器视图还没有被设置,会首先调用loadview的方法。
3)如何知道控制器的view是懒加载的,就是通过重写loadview方法来实现的
- (void)loadView {
[superloadView];
}
注意:当控制器要开始加载的时候才会真正使用到控制器的懒加载。
2.3 手动创建UIWindow:(继承UIView)
①什么是UIWindow
②如何创建Window步骤
1、创建UIWindow 可以直接设置frame信息, alloc initwithframe
设置颜色,就可见
2、 添加到view上
注意:这样的手动创建默认是隐藏的,所以要设置hidden = NO才能显示出来
三、3种创建控制器的方式
3.1—>存代码
3.2—>在storboard中创建
3.3—>通过XIB创建
3.4—>创建注意的细节
3.1存代码创建控制器:
在2.1中已经讲过。
3.2 在storboard中创建控制器(UIStoryboard)
①关于UIStoryboard的这个对象
②步骤
③UIStoryboard头文件
步骤:
1)需要先创建storyboard文件 [里面是空的、拖一个,注意还有初始化箭头]
2)在文件中拖入想要创建控制器
3)通过代码实现
1.需要加载文件 UIStoryboard类型的文件
//对应的加载方法
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
2.在从文件中实例化对应的控制器
- (nullable __kindof UIViewController *)instantiateInitialViewController;
UIStoryboard的头文件方法:
->根据storyboard文件名称去加载storyboard文件
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
->instant 实例化 实例化文件中的初始化控制器
- (nullable __kindof UIViewController *)instantiateInitialViewController;
->通过标示去实例化控制器
- (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;
当多控制器的时候,通过固定标识(storyboardID)设置好ID 就可以调用这个方法,让指定控制出现,而不用管初始化箭头
3.3 通过XIB创建控制器
步骤:
1)创建控制器类(继承什么呢?)
2)创建xib文件(XIB里面是空的时候,应该拖一个什么给XIB呢?)
准备工作(如果在创建前点击了同时创建XIB就不用管连线和class的问题)
需要修改xib文件的"file's Owner",类型改为对应控制器的类型
需要将fileOwner中的view属性,连线到xib文件中的view
3)代码创建
三种情况:
- xib文件我们是随意设置的拿就需要类名+ alloc + initWithNibName
- xib的文件名称是跟控制器类似缺少Controller或ViewController类名+ alloc + init;
- xib文件名称与控制器名称相同类名+ alloc + init;
三种方法创建的相同之处和不同之处:
相同:
0、都要删除系统自带的控制器或者storyboard
1、都是要先实例化一个窗口Window;
2、创建后都要设置为根控制器
3、成为主窗口并显示出来
不同:
1、纯代码创建时创建一个继承自UIViewController的类,并实例化出这个控制器
通过storyboard创建1、先要先加载故事板
2、通过加载到的文件实例化一个新的控制器
通过XIB创建1、创建一个类继承UIViewController的类(跟纯代码很像)
2、创建一个xib,更改calss和连线file's Owner
3、根据创建的类实例化一个UIViewController控制器。
要注意在创建XIB时文件名一样,不一样和类似时
创建注意的细节
1>通过storyboard文件创建的控制器,将来怎么写代码?
需要创建一个类,控制器类型,并且进行关联
将来如果在其他地方需要使用这个控制器,不能够通过类名+ alloc + init去创建.
2>通过xib文件创建的控制器,容易出现的错误?
没有设置view的属性view的outlet没有连线
要跟自定义view区分开
以前自定义view的时候,有没有改过file's Owner.没有改变.
只要当xib文件中view要作为控制器的视图去展示的时候再修改,并连线.
将来自定义view的时候,有对应的xib文件.xib文件的名称不要根控制器类似,或相同.
四、导航控制器UINavigationController【掌握】
4.1—>什么是UINavigationController、作用是什么?
4.2—>如何创建?
4.3—>如何使用(push和pop的使用)
三个关键字:1、push推2、pop弹3、navigationItem导航条,导航栏目导航栏
4.1什么是UINavigationController、作用是什么?
①父控制器和子控制器
②控制器的类型
当多控制器时:
如果A控制器管理了B、C、D三个控制器,那么A控制器就是父控制器,其他被管理的就是子控制器
系统为我们提供了两种比较特殊的管理控制器:
1、UINavigationController——导航栏控制器
2、UITableBarController——便签控制器
4.2 如何创建:
步骤:
1、实例化window窗口
2、创建 导航控制器 同时指定根控制器initWithRootViewController:
也可以直接alloc init 进行创建导航栏
导入头文件,创建子控制器
3、设置为根控制器
4、设置为主窗口并显示
注意:头文件中有两种方式创建方式(allco init)
- (instancetype)initWithNavigationBarClass:(nullableClass)navigationBarClass toolbarClass:(nullableClass)toolbarClass
//创建的同时直接指定根控制器,原理也是push 没有动画
- (instancetype)initWithRootViewController:(UIViewController*)rootViewController;
5、将导航栏设置为根目录
6、让窗口成为主窗口并可见
导航栏的大小就是视图的大小
4.3 如何使用
①基本使用/跳转使用
②跳转下一个界面
③返回上一个界面
④内容设置()
1)基本使用
创建多个子控制器(xib创建)
push和pop
自己创建导航栏,在引入其他子控制器,然后由导航栏直接push
TSLBlueController*blueVc = [[TSLBlueControlleralloc]init];
[ nav pushViewController:redVcanimated:YES];
2) 跳转到下一个控制器(push)
1、创建想要跳转的控制器的对象。
2、直接执行跳转
引入属性:navigationController
self.navigationController 找到当前管理他的控制器。这句话类型找父控件然后再push
[self.navigationControllerpushViewController:greenVcanimated:YES];
3)返回
方法:
a .返回到上一个控制器:
[self.navigationControllerpopViewControllerAnimated:YES];
b. 返回到根控制器
popToRootViewControllerAnimated
c. 返回到一个指定的控制器
popToViewController:UIViewController animated:BOOL;
返回一个指定的控制器的时候,需要获取到管理他的控制器上的所有控制器(是一个数组)
self.navigationController.viewControllers
//然后通过角标接收一下然后在pop
4)内容设置
一般情况下,会在这个方法中设置当前控制器导览栏相关的内容
这些设置都是在
- (void)viewDidLoad {
[superviewDidLoad];
self.navigationItem.title=@"奔驰";
}
进行设置。不然会出现迟缓。
1、文字:
self.navigationItem.title=@"特斯拉";
2、左侧按钮
self.navigationItem.leftBarButtonItem= [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCameratarget:nilaction:nil];
3、右侧按钮
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nilaction:nil];
4、返回按钮
self.navigationItem.backBarButtonItem= [[UIBarButtonItemalloc]initWithTitle:@"返回"style:UIBarButtonItemStylePlaintarget:nilaction:n
4.4 控制器视图的生命周期方法
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
4.5通过interface builder使用导航控制器
拖拉拽
①如何使用
②注意
直接创建storyboard直接拖拉拽Show一下