zoukankan      html  css  js  c++  java
  • 007-多控制器管理(控制器间的数据传递)

     掌握

      •  1.控制器以及view的多种创建方式
     
      •  2.UINavigationController的简单使用:添加移除子控制器
     
      •  3.UINavigationBar内容的设置
     
      •  4.Segue之数据传递

     •  1.控制器以及view的多种创建方式

    问题一:如何创建一个控制器?  

      •控制器常见的创建方式有以下几种
      1》通过storyboard创建控制器
        •先加载storyboard文件(Test是storyboard的文件名)

         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

        •接着初始化storyboard中的控制器
         Ø初始化“初始控制器”(箭头所指的控制器)

         WHBViewController *vc = [storyboard instantiateInitialViewController];

     
         Ø通过一个标识初始化对应的控制器

         WHBViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@”vc"];

     
      2》直接创建

          WHBViewController *vc = [[WHBViewController alloc] init];

     
      3》指定xib文件来创建

          WHBViewController *vc = [[WHBViewController alloc] initWithNibName:@"WHBViewController" bundle:nil];

    问题二:view的多种创建方式优先级?

     

    ps:控制器view的延迟加载

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

    •  2.UINavigationController的简单使用:添加移除子控制器

    •UINavigationController的使用步骤
    Ø初始化UINavigationController
    Ø设置UIWindow的rootViewController为UINavigationController
    Ø根据具体情况,通过push方法添加对应个数的子控制器
     
    •UINavigationController以栈的形式保存子控制器

    @property(nonatomic,copy) NSArray *viewControllers;

    @property(nonatomic,readonly) NSArray *childViewControllers;

    •使用push方法能将某个控制器压入栈

    - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

    •使用pop方法可以移除控制器
    Ø将栈顶的控制器移除

    - (UIViewController *)popViewControllerAnimated:(BOOL)animated;

    Ø回到指定的子控制器

    - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;

    Ø回到根控制器(栈底控制器)

    - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;


    •  3.UINavigationBar内容的设置

    •导航栏的内容由栈顶控制器的navigationItem属性决定
     
    •UINavigationItem有以下属性影响着导航栏的内容
    Ø左上角的返回按钮

    @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;

    Ø中间的标题视图

    @property(nonatomic,retain) UIView          *titleView;

    Ø中间的标题文字

    @property(nonatomic,copy)   NSString        *title;

    Ø左上角的视图

    @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;

    ØUIBarButtonItem *rightBarButtonItem  右上角的视图

    @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;


    •  4.Segue之数据传递

    问题一:什么是Segue?

    •Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)例如下图所示:
    问题二:Segue有什么属性?
    •每一个Segue对象,都有3个属性
    Ø唯一标识

    @property (nonatomic, readonly) NSString *identifier;

    Ø来源控制器

    @property (nonatomic, readonly) id sourceViewController;

    Ø目标控制器

    @property (nonatomic, readonly) id destinationViewController;

    问题三:Segue有哪些类型?

    •根据Segue的执行(跳转)时刻,Segue可以分为2大类型 
    Ø自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转  
      如下图所示:  按住Control键,直接从控件拖线到目标控制器  点击“登录”按钮后,就会自动跳转到右边的控制器
          ps:点击某个控件后,界面跳转时不想做任何处理,想跳转到下一个界面,建议使用“自动型Segue”  
    Ø手动型:需要通过写代码手动执行Segue,才能完成界面跳转
      如下图所示:  按住Control键,从来源控制器拖线到目标控制器  手动型的Segue需要设置一个标识(如下图所示)
                       
    问题四:如何通过代码手动执行手动型Segue实现界面跳转?
    •利用performSegueWithIdentifier:方法可以执行某个Segue,完成界面跳转
    在来源控制器的对应的监听事件方法里面写入下列代码,就可以完成界面间的跳转
    [self performSegueWithIdentifier:@“addContextSegue” sender:nil]; // 这个self是来源控制器
    •performSegueWithIdentifier:sender:方法的完整执行过程
    1》.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
      1》》.设置Segue对象的sourceViewController(来源控制器)
      2》》新建并且设置Segue对象的destinationViewController(目标控制器)
    2》.调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender; // 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
    3》.调用Segue对象的- (void)perform;方法开始执行界面跳转操作
    Ø取得sourceViewController所在的UINavigationController
    Ø调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
    问题五:如何实现控制器之间的数据传递?
    •控制器之间的数据传递主要有2种情况:顺传和逆传
    Ø顺传
    控制器的跳转方向: A ------> C
    数据的传递方向    : A ------> C
    数据的传递方式    :  在A的prepareForSegue:sender:方法中根据segue参数取得destinationViewController, 也就是控制器C, 直接给控制器C传递数据(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
    Ø逆传
    控制器的跳转方向: A <------ C
    数据的传递方向    : C ------> A
    数据的传递方式    :  让A成为C的代理, 在C中调用A的代理方法,通过代理方法的参数传递数据给A
     
  • 相关阅读:
    C# ListView应用
    C# 使用System.Speech 进行语音播报和识别
    支付宝支付-扫码支付详解
    使用git提交项目到码云
    C# byte[]数组和string的互相转化 (四种方法)
    C#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换
    C# 结构体和List<T>类型数据转Json数据保存和读取
    对 JSON 数据进行序列化和反序列化
    win10与虚拟机fedora14使用samba文件共享
    serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法
  • 原文地址:https://www.cnblogs.com/lszwhb/p/3906095.html
Copyright © 2011-2022 走看看