在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. [转]Socket send函数和recv函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  2. [Effective Java]第七章 方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. 顾维灏谈百度地图数据采集:POI自动处理率达90%

    顾维灏谈百度地图数据采集:POI自动处理率达90%   发布时间:2015-12-21 22:37        来源:cnsoftnews.com        作者:   百度地图还创新研发高精地 ...

  4. Vnc viewer与windows之间的复制粘贴

    用VNC连接到Linux之后,最纠结的问题就是无法复制粘贴.其实很简单,在Linux里面,打开一个终端,然后输入命令: vncconfig 之后,会弹出一个窗口 不要关闭那个小窗口 之后,就可以愉快的 ...

  5. JAVA入门 第五周 1多项式

    1 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的 ...

  6. python一个注意的地方

    https://www.zhihu.com/question/25874136 class test: l=[] def init(self): self.l=['1','2','7'] a1=tes ...

  7. 代码中特殊的注释技术——TODO、FIXME和XXX的用处

    本文内容概要: 代码中特殊的注释技术--TODO.FIXME和XXX的用处. 前言:今天在阅读Qt  Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上, ...

  8. Broadcast Receviewer

    使用Braodcast Receiver 一.新建一个空的工程,命名为LearnBroadcastReceiver 二.为主界面添加一个按钮 三.新建一个broadcast receiver,命名为M ...

  9. XML HTML

    XML和HTML常用转义字符 XML和HTML中都有一些特殊的字符,这些字符在XML和HTML中是不能直接使用的,如果必须使用这些字符,应该使用其对应的转义字符. XML常用转义字符: 字符 转义字符 ...

  10. javascript的执行顺序(转载)

    之前从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序.如果说,JavaScript引擎的工作机制比较深奥 ...