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

007-多控制器管理(控制器间的数据传递),布布扣,bubuko.com

时间: 2024-12-28 09:13:54

007-多控制器管理(控制器间的数据传递)的相关文章

007-多控制器管理及其控制器间的数据传递

掌握 • 1.控制器以及view的多种创建方式 • 2.UINavigationController的简单使用:添加\移除子控制器 • 3.UINavigationBar内容的设置 • 4.Segue之数据传递 • 1.控制器以及view的多种创建方式 问题一:如何创建一个控制器? •控制器常见的创建方式有以下几种 1>通过storyboard创建控制器 •先加载storyboard文件(Test是storyboard的文件名) UIStoryboard *storyboard = [UISto

iOS开发:控制器间的数据传递

在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这两种传递方式的具体做法. 顺传递 如果是用的SB,顺传递较简单,只需在A控制器的prepareForSegue:sender:方法中根据segue参数取得destinationViewController,也就是目标控制器C,直接给控制器C传递数据.从A传来的数据要在C的viewDidLoad方法中

ASP.NET MVC 之控制器与视图之间的数据传递

今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, 如何在控制器中获取,处理这些数据. ASP.NET MVC 中所有控制器都继承Controller类,而Controller又继承自ControllerBase,而ControllerBase下又包含ViewData以及TempData视图数据字典. 一,使用ViewData传递数据 ViewDat

C#不同窗体间通信,数据传递

在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后,准备献丑了. 1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记录的ID,为了避免每个窗体都去查询数据库,可以把这些公共变量或信息写入配置文件,每个窗体去读配置文件即可. 2.       如果共享信息的窗体不多,则对于兄弟窗口,可以通过其共同的父窗体来传递数据,此时父窗体如果

activity间的数据传递

1.创建一个新的activity,然后在AndroidManifest.xml配置文件中完成声明. <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="QuizActivity"android:label="@string/app_name">

React Native移动开发实战-3-实现页面间的数据传递

React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件中指定的,而且一经指定,在被指定的组件的生命周期中则不再改变. state通常是用于存储需要改变的数据,并且当state数据发生更新时,React Native会刷新界面. 了解了props与state的区别之后,读者应该知道,要将首页的数据传递到下一个页面,需要使用props.所以,修改home.

hive、sqoop、MySQL间的数据传递

hdfs到MySQL csv/txt文件到hdfs MySQL到hdfs  hive与hdfs的映射: drop table if exists emp;create table emp ( id int comment 'ID', emp_name string comment '姓名', job string ) comment '职业' row format delimited -- stored as rcfile location '/user/hive/warehouse/emp';

iOS基础-UIKit框架-多控制器管理-控制器创建和控制器view的创建

掌握 一.控制器的多种创建方式如何创建一个控制器 通过storyboard创建注意:加载UIStoryboard仅仅是加载名称叫做Test的storyboard,并不会创建 storyboard中的控制器以及控件 通过xib创建注意:要想让xib里的view设置为所创建控制器的view,必须设置xib的File's owner 为所创建控制器.并且File's owner点右键将view连到xib里的view上.storyboard默认已经完成了上述操作 二.控制器view的创建方式1.没有同名

控制器管理-控制器加载过程

1.是否重写了loadView方法,若重写则根据loadView的代码创建View 2.未重写loadView方法,根据storyboard的描述去创建(eg.中根据Demo去创建) eg.UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Demo" bundle:nil]; 3.根据nibName对应的xib的描述去创建 eg.指定xib文件来创建:DemoViewController *mj = [[Demo