在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递。顺传递是指数据的传递方向和控制器的跳转方向相同(如图1);逆传递是指数据的传递方向和控制器的跳转方向相反(如图2)。这里分别介绍这两种传递方式的具体做法。

顺传递

如果是用的SB,顺传递较简单,只需在A控制器的prepareForSegue:sender:方法中根据segue参数取得destinationViewController,也就是目标控制器C,直接给控制器C传递数据。从A传来的数据要在C的viewDidLoad方法中取得,进而利用数据做一些业务操作,如给C上的UI控件赋值。

逆传递

逆传递或者非SB开发需要用到代理模式,简单来讲就是:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A。具体可分为以下三个步骤:

  • 1.在C的.h文件中定义协议(协议就是一堆方法的声明,这些方法的具体实现是给遵守协议的A去完成的)并添加一个delegate属性用于设置代理对象;
  • 2.在C的m文件中也要调用该代理方法通知其代理;
  • 3.A遵守协议,实现代理方法。

案例:

 点击A中的“请选择”,跳转到C控制器,选中对应的数据行后返回到A并将选中的数据传递给A进行显示(如下图)。

       

A                                                  C                                                  A

1.在控制器C的.h文件中定义协议并添加delegate属性:

 #import <UIKit/UIKit.h>

 @class SelectDeptViewController, Department;

 @protocol SelectDeptViewControllerDelegate <NSObject>

 @optional

 - (void)selectDeptViewController:(SelectDeptViewController *)selectDeptVC didSelectDept:(Department *)department;

 @end

 @interface SelectDeptViewController : UITableViewController

 @property (nonatomic, weak) id<SelectDeptViewControllerDelegate> delegate;

 @end

2.在控制器C的.m文件中调用代理方法,将数据通过代理方法传递给其代理:

 #pragma mark - UITableView Delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.delegate respondsToSelector:@selector(selectDeptViewController:didSelectDept:)]) {
Department *dept = self.departments[indexPath.row];
[self.delegate selectDeptViewController:self didSelectDept:dept];
} // 关闭当前控制器
[self.navigationController popViewControllerAnimated:YES];
}

3.A控制器实现C的代理方法,拿到数据进行业务操作:

 # pragma mark - SelectDeptViewControllerDelegate方法

 - (void)selectDeptViewController:(SelectDeptViewController *)selectDeptVC didSelectDept:(Department *)department
{
self.department.text = department.name;
}

总结:

  其实iOS开发中的代理模式非常常见。比如TableView要显示数据,但是它自己是没有数据的,数据在控制器里,这就涉及到TableView访问控制器里数据的需求,我们通过代码或拖线的方式让控制器成为TableView的代理,并在控制器中实现TableView的代理方法。

iOS:控制器间的数据传递的更多相关文章

  1. WinForm登陆:窗体间的数据传递

    1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...

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

    在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...

  3. 【转】Unity3d的单例及场景间的数据传递

    http://blog.csdn.net/zy19940906/article/details/47724387  单例是场景间切换时传递数据的最常见的方式之一,在unity中,很多方法被封装,有时候 ...

  4. hive、sqoop、MySQL间的数据传递

    hdfs到MySQL csv/txt文件到hdfs MySQL到hdfs  hive与hdfs的映射: drop table if exists emp;create table emp ( id i ...

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

    React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...

  6. fragment间的数据传递

    今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...

  7. vue组件间的数据传递

    父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据.   App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...

  8. 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等

    (1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...

  9. ios应用view之间数据传递的方式

    对于不同的viewcontroller之间数据的共享和处理 采用代理的方式,子viewcontroller设计代理协议,并定义协议接口,父viewcontroller实现协议接口,实现子视图控制器退出 ...

随机推荐

  1. hdu 1348 (凸包求周长)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  2. jQuery实现的简单文字提示效果模拟title(转)

    来源 http://www.cnblogs.com/puzi0315/archive/2012/10/17/2727693.html 模拟title实现效果,可以修改文字的样式,换行等. 文件下载: ...

  3. Codeforces Round #286 (Div. 2) B. Mr. Kitayuta's Colorful Graph dfs

    B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...

  4. C#垃圾回收机制(GC)

    GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...

  5. maven2 配置M2_REPO

    从eclipse中增加了maven2的插件之后,maven默认的本地库的路径是${user}/.m2/repository/下,一般windows用户的操作系统都安装在C盘,所以这个目录 下的jar包 ...

  6. Flex打印功能FlexPrintJob调用

    收藏下很详细的学习资料 http://wenku.baidu.com/view/b3d4f40702020740be1e9bf8.html import mx.printing.FlexPrintJo ...

  7. ubuntu12.04 gdb安装使用

    参考文档:http://blog.csdn.net/haoel/article/details/2879 http://www.programlife.net/gdb-manual.html [新手笔 ...

  8. 用Maven创建第一个项目

    1.在Eclipse左侧的空白处点击鼠标右键,选择:New>Other : 2.选择Maven项目,点击"Next"按钮: 3.保持默认,直接点击“Next”按钮: 4.选择 ...

  9. 新建我的 第一个maven项目

    maven是管理项目的,myeclipse是编写代码的.第一次写项目都要配置好多东西,很麻烦,now 来看看怎样新建一个maven项目. 百度经验:jingyan.baidu.com 工具/原料   ...

  10. TCP/IP 小知识

    子网掩码有数百种,这里只介绍最常用的两种子网掩码,它们分别是“255.255.255.0”和“255.255.0.0”. 1.子网掩码是“255.255.255.0”的网络:最后面一个数字可以在0~2 ...