多控制器管理(UINavigationController)

内容概要:

一、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函数中,做了以下事情:

  1. 先创建自动释放池,将来应用的所有操作都是在自动释放内部操作的.应用销毁的时候直接释放自动释放池
  2. 调用 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加载自定义控制器的方法:

①需要准备做什么?
②步骤?

什么是自定义控制器:创建自己的控制器继承系统的某一个控制器!

纯代码的方式:
准备工作

删除系统自带的内容

  1. ViewController.h /.m两个文件 /Main.storyboard文件
  2. 删除配置文件中默认要加载的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)代码创建

三种情况:

  1. xib文件我们是随意设置的拿就需要类名+ alloc + initWithNibName
  2. xib的文件名称是跟控制器类似缺少Controller或ViewController类名+ alloc + init;
  3. 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一下

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,834评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • gcc在Centos下的安装:使用的是以下语句:yum install gcc 以为安装g++,类似的应该使用:y...
    文东之名阅读 9,800评论 0 0
  • 有这么个传说,情人节这天,当一对情侣乘的座舱转到摩天轮最高点时,彼此十指交扣,许下的愿望都能成真。 1 看着无限被...
    阿春牧羊犬阅读 1,182评论 4 14