• IOS的控制器


    控制器简单来说,就是用来做界面跳转的,类似于 Android 的Intent

    1.创建一个控制器

     1 控制器的常见的创建方式
     2 
     3 1)通过storyboard创建
     4 
     5 //直接创建
     6 NJViewController *nj = [[NJViewController alloc]init];
     7 
     8 //指定xib文件
     9 NJViewcontroller *nj = [[NJViewController alloc]
    10 initWithNibName:@"NJViewController" bundle:nil];
    11 
    12 //先加载storyboard文件(Test是stroyboard的文件名)
    13 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
    14 
    15 接着初始化storyboard中的控制器
    16 初始化"初始控制器"(箭头所指的控制器)
    17 NJViewController *nj = [storyboard instantiateInitialViewController];
    18 
    19 通过一个标识初始化对应的控制器
    20 NJViewController *nj=[storyboard instantiateViewControllerWithIdentifier:@"nj"];

    MJViewController的view的创建图

    控制器的加载

    1 1.控制器的view是延迟加载的,用到时再加载
    2 2.可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
    3 3.控制器的view加载完毕就会调用viewDidLoad方法

    多控制器

     1 1.一个ios的app很少只由一个控制器组成,除非这个app极其简单
     2 2.当app中有多个控制器的时候,我们就需要对这些控制器进行管理
     3 3.有多个view时,可以用一个大得view去管理1个或者多个小view
     4 4.控制器也是如此,用1个控制器去管理其他多个控制器
     5  
     6 比如:
     7        用一个控制器A 去管理3个控制器B、C、D 控制器A被称为控制器B、C、D 的"父控制器",控制器 B、C、D  的被称为控制器A的子控制器
     8 
     9 为了便于管理控制器,IOS提供了2个比较特殊的控制器
    10 UINavigationController
    11 UITabBarController

    UINavigationController

    利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的"设置"应用

    UINavigationController的使用步骤

     1 1.初始化UINavigationController
     2 2.设置UIWindow的rootViewController为UINavigationController
     3 3.根据具体情况,通过push方法添加对应个数的子控制器
     4 
     5 UINavigationController以栈的形式保存子控制器
     6 @property(nonatomic,copy)NSArray *viewControllers;
     7 @property(nonatomic,readonly)NSArray *childViewControllers;
     8 
     9 使用push方法能将某个控制器压入栈
    10 -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
    11 
    12 使用pop方法可以移除控制器
    13 //将栈顶的控制器移除
    14 -(UIViewController *)popViewControllerAnimated:(BOOL)animated;
    15 //回到指定的子控制器
    16 -(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
    17 //回到根控制器(栈底控制器)
    18 -(NSArray *)popToRootViewControolerAnimated:(BOOL) animated;

    修改导航栏的内容

     1 导航栏的内容由栈顶控制器的navigationitem属性决定
     2 
     3 UINavigationItem有以下属性影响着导航栏的内容
     4 //左上角的返回按钮
     5 @property(nonatomic,retain)UIBarButtonItem *backBarButtonItem;
     6 //中间的标题视图
     7 @property(nonatomic, retain)UIView *titleView;
     8 //中间的标题文字
     9 @property(nonatomic,copy) NSString  *title;
    10 //左上角的视图
    11 @property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;
    12 //UIBarButtonItem *rightBarButtonItem 右上角的视图
    13 @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

    Segue

    Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)

    Segue的属性

    每一个segue对象,都有3个属性

    1 //唯一标识
    2 @property(nonatomic, readonly) NSString *identifier;
    3 //来源控制器
    4 @property(nonatomic,readonly) id sourceViewController;
    5 //目标控制器
    6 @property(nonatomic,readonly) id destinationViewController;

    根据Segue的执行(跳转)时刻,Segue可以分为2大类型

    自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转

    手动型:需要通过写代码手动执行Segue,才能完成界面跳转

    自动型:

    手动型:

    performSegueWithldentifier:sender:

    利用performSegueWithIdentifier:方法可以执行某个Segue,完成界面跳转

    接下来研究performSegueWithIdentifier:sender:方法的完整执行过程

    [self performSegueWithIdentifier:@"login2contacts" sender:nil];

    //这个self是来源控制器

    1.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象

    设置Segue对象的sourceViewController(来源控制器)

    新建并且设置Segue

    2.调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象
    
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender: (id) sender;
    
    //这个sender是当初performSegueWithIdentifier:sender:中传入的sender
    
    3.调用Segude对象的-(void)perform;方法开始执行界面跳转操作
    
    取得sourceViewController所在的UINavigationController
    
    调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
    
    [self performSegueWithIdentifier:@"login2contacts" sender:@"jack"];
    
    
    
    -(void)perpareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

    控制器的数据传递

    控制器之间的数据传递主要有两种情况:顺传和逆传

    顺传

    1 控制器的跳转方向:A-->C
    2 数据的传递方向:  A--->C
    3 数据的传递方式: 在A的 perpareForSeque:sender 方法中根据segue参数取得destinationViewController,也就是控制器C,直接给控制器C传递数据
    4 (要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)

    逆传

    1 控制器的跳转方向:A -->C
    2 数据的传递方向: C-->A
    3 数据的传递方式:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A
  • 相关阅读:
    hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)
    hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
    山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)
    poj 2336 Ferry Loading II ( 【贪心】 )
    HDU 2037 今年暑假不AC ( 起始与终止时间 【贪心】)
    hdu 2015校赛1002 Dual horsetail (思维题 )
    poj 3041 Asteroids(二分图 *【矩阵实现】【最小点覆盖==最大匹配数】)
    poj 3268 Silver Cow Party (最短路算法的变换使用 【有向图的最短路应用】 )
    【P1326】超级教主
    Tyvj 9.10 总结 (其实只是发一下心情)
  • 原文地址:https://www.cnblogs.com/developer-wang/p/4541275.html
Copyright © 2020-2023  润新知