iOS:控制器间的数据传递
在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:控制器间的数据传递的更多相关文章
- WinForm登陆:窗体间的数据传递
1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...
- C#不同窗体间通信,数据传递
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...
- 【转】Unity3d的单例及场景间的数据传递
http://blog.csdn.net/zy19940906/article/details/47724387 单例是场景间切换时传递数据的最常见的方式之一,在unity中,很多方法被封装,有时候 ...
- hive、sqoop、MySQL间的数据传递
hdfs到MySQL csv/txt文件到hdfs MySQL到hdfs hive与hdfs的映射: drop table if exists emp;create table emp ( id i ...
- React Native移动开发实战-3-实现页面间的数据传递
React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...
- fragment间的数据传递
今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...
- vue组件间的数据传递
父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...
- 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等
(1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...
- ios应用view之间数据传递的方式
对于不同的viewcontroller之间数据的共享和处理 采用代理的方式,子viewcontroller设计代理协议,并定义协议接口,父viewcontroller实现协议接口,实现子视图控制器退出 ...
随机推荐
- SQL判断临时表是否存在
IF EXISTS(select * from tempdb..sysobjects where id=object_id('tempdb..#tb')) BEGIN DROP TABLE #tb E ...
- Python-爬虫初学
#爬取网站中的图片 1 import re #正则表达式库 import urllib #url链接库 def getHtml(url): page = urllib.urlopen(url) #打开 ...
- javascript权威指南笔记--javascript语言核心(二)
1.函数作用域:在函数内声明的所有变量在函数体内始终是可见的.这意味着在变量声明之前甚至已经可用. *“声明提前”:javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数的顶部. fu ...
- Threejs 使用的3D格式
3D格式你可以通过任意软件导出(.3ds,dae等),但是threejs 无法使用, 1,http://www.blender.org/ 下载这款开源的3d软件 2,https://github.co ...
- PHP爬虫抓取网页内容 (simple_html_dom.php)
使用simple_html_dom.php,下载|文档 因为抓取的只是一个网页,所以比较简单,整个网站的下次再研究,可能用Python来做爬虫会好些. <meta http-equiv=&quo ...
- Send to Kindle :一键推送网页内容到多看
http://site.douban.com/129629/widget/notes/7074800/note/207072907/ 注意:增加配置信息,一键发送,方便及时分享网页.
- [转载] 【每周推荐阅读】C-Store:列式存储数据库
Record-based与column-based是数据库和存储系统里面两种不同的data layout.我们的思维逻辑是基于行记录的,即Record-based data layout,数据记录都是 ...
- rpm and yum commands
rpm命令 rpm包,由“-”.“.”构成,包名.版本信息.版本号.运行平台 对已安装软件信息的查询 rpm -qa 查询已安装的软件 rpm ...
- Js_字符串操作
字符串操作方法 charAt()以单字符串的形式返回给定位置的哪个字符串 例: var num = "hello world"; alert(num.charAt(1))//“e” ...
- vs2010配置OpenCV2.4.7详细步骤
vs2010配置opencv2.4.7 需要注意:opencv里x86的vc10对应vs2010版本,vc11对应vs2012版本,vc12对应vs2013及以上版本,若vs2013版本的软件配置时选 ...