多控制器管理(UINavigationController)

来源:互联网 发布:搭建yum仓库 编辑:程序博客网 时间:2024/05/18 01:46

内容概要:

一、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*)application3//已经进入后台- (void)applicationDidEnterBackground:(UIApplication*)application4//将要进入前台- (void)applicationWillEnterForeground:(UIApplication*)application5//已经成为活跃状态- (void)applicationDidBecomeActive:(UIApplication*)application6//将要销毁- (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一下

0 0
原创粉丝点击