美文网首页
多控制器管理(UINavigationController)

多控制器管理(UINavigationController)

作者: 外号狐狸 | 来源:发表于2016-04-30 18:02 被阅读256次

    内容概要:

    一、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一下

    相关文章

      网友评论

          本文标题:多控制器管理(UINavigationController)

          本文链接:https://www.haomeiwen.com/subject/ghukrttx.html