在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 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  2. .net 浏览器请求过程(图)

    大致: 细节: (信息来源于传智播客教学视频)

  3. jQuery:使用$获取对象后检查该对象是否存在

    注意: 1)即使jQ获取到网页中不存在的元素也不会报错 2)使用$("#tt")形式获取到的永远是对象,即使网页上没有此元素 jQuery检查某个元素在网页上是否存在时,不能使用以 ...

  4. More Effective C++ (2)

    接下来的是more effective c++ 11至20条款: 11.禁止异常信息(exceptions)传递到析构函数外.析构函数的调用情况可能有两种:(1)对象正常销毁 (2)异常传播过程中的栈 ...

  5. 原生js如何获取当前所加载网页的文件路径和名称

    结合使用string对象中的substr()和lastIndexOf()方法. 当前页面路径:file:///C:/Users/Administrator/Desktop/test.html < ...

  6. [转载] 【每周推荐阅读】C-Store:列式存储数据库

    Record-based与column-based是数据库和存储系统里面两种不同的data layout.我们的思维逻辑是基于行记录的,即Record-based data layout,数据记录都是 ...

  7. 手动导出Excel方法

    private void dgJiBingZhenDuanBind() {   Response.Clear(); Response.Charset = "GB2312"; Res ...

  8. 在VNC中Xfce4中Tab键失效的解决方法

    说明 在Ubuntu Server 14.04上安装了xfce4桌面环境,但是却发现在终端中Tab键不能自动补齐(但是Ctrl + I 仍然可以用). 出现这种情况的原因是,由于Tab键的功能被窗口快 ...

  9. (六)ARM状态寄存器-PSR

    ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的 ...

  10. Spring集成JPA提示Not an managed type

    在做Spring与JPA集成时,出现问题如下: Caused by: java.lang.IllegalArgumentException: Not an managed type: class co ...