● 控制器之间的数据传递主要有2种情况:顺传和逆传

➢ 顺传

●  控制器的跳转方向: A ->C

●  数据的传递方向 : A -> C

● 数据的传递方式 : 在A的prepareForSegue:sender:方法中根据segue参数取得 destinationViewController,

也就是控制器C, 直接给控制器C传递数据 (要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)

顺传事例代码:

NJContatcsViewController.m(主控制器)

#import "NJContatcsViewController.h"
#import "NJAddViewController.h"
#import "NJContatc.h"
#import "NJEditViewController.h" @interface NJContatcsViewController ()<UIActionSheetDelegate, NJAddViewControllerDelegate, NJEditViewControllerDelegate>
/**
* 点击注销按钮
*/
- (IBAction)logout:(UIBarButtonItem *)sender; /**
* 保存所有用户数据
*/
@property (nonatomic, strong) NSMutableArray *contatcs;
@end @implementation NJContatcsViewController
- (void)viewDidLoad
{
[super viewDidLoad];
} - (IBAction)logout:(UIBarButtonItem *)sender
{
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil];
[sheet showInView:self.view]; }
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ( != buttonIndex) return; // 移除栈顶控制器
[self.navigationController popViewControllerAnimated:YES];
} // 无论是手动类型的segue还是自动类型的segue, 在跳转之前都会执行该方法
// 控制器跳转之前(执行segue之前)执行
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// 0.判断目标控制器是添加还是编辑
// 1.取出目标控制器
UIViewController *vc = segue.destinationViewController;
if ([vc isKindOfClass:[NJAddViewController class]]) {
NJAddViewController *addVc = (NJAddViewController *)vc;
// 2.设置代理
addVc.delegate = self;
}else if ([vc isKindOfClass:[NJEditViewController class]]){
// 传递数据
NJEditViewController *editVc = (NJEditViewController *)vc; // 通过tableview获取被点击的行号
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
// 取出被点击行的模型
NJContatc *c = self.contatcs[path.row];
NSLog(@"联系人列表 %p" , c);
// 赋值模型
editVc.contatc = c;
// 设置代理
editVc.delegate = self;
}
} #pragma mark - NJEditViewControllerDelegate
- (void)editViewControllerDidClickSavBtn:(NJEditViewController *)editViewController contatc:(NJContatc *)cpmtatc
{
// 1.修改模型
// NSIndexPath *path = [self.tableView indexPathForSelectedRow];
// self.contatcs[path.row] = cpmtatc; // 2.刷新表格
[self.tableView reloadData];
} #pragma mark - NJAddViewControllerDelegate
- (void)addViewControllerDidAddBtn:(NJAddViewController *)editViewController contatc:(NJContatc *)contatc
{
NSLog(@"添加了新联系人 %@ %@ %@", contatc.name, contatc.phoneNumber, contatc.email);
// 1.保存数据到数组中
[self.contatcs addObject:contatc];
// 2.刷新表格
[self.tableView reloadData];
}
- (NSMutableArray *)contatcs
{
if (_contatcs == nil) {
_contatcs = [NSMutableArray array];
}
return _contatcs;
} #pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.contatcs.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"contatcs";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// if (cell == nil) {
// cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
// }re // 设置数据
NJContatc *c = self.contatcs[indexPath.row];//
NSLog(@"cellForRowAtIndexPath %p", c);
cell.textLabel.text = c.name;
cell.detailTextLabel.text = c.phoneNumber;
// 返回cell
return cell; }

➢ 逆传 (使用代理方式)
● 控制器的跳转方向: A -> C

●  数据的传递方向 : C->A

●  数据的传递方式 : 让A成为C的代理, 在C中调用A的代理方法,通过代理方法的参数传递 数据给A

逆传事例代码:

NJEditViewController.h(创建代理)

#import <UIKit/UIKit.h>
@class NJContatc, NJEditViewController; @protocol NJEditViewControllerDelegate <NSObject> - (void)editViewControllerDidClickSavBtn:(NJEditViewController *)editViewController contatc:(NJContatc *)cpmtatc; @end @interface NJEditViewController : UIViewController
/**
* 用于接收联系人列表传递过来的数据
*/
@property (nonatomic, strong) NJContatc *contatc; @property (nonatomic, weak) id<NJEditViewControllerDelegate> delegate;
@end

NJEditViewController.m(传递数据)

#import "NJEditViewController.h"
#import "NJContatc.h" @interface NJEditViewController () @property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *phoneField;
@property (weak, nonatomic) IBOutlet UIButton *saveBtn;
/**
* 编辑按钮点击事件
*/
- (IBAction)editBtnOnClick:(UIBarButtonItem *)sender;
/**
* 保存按钮点击事件
*
* @param sender <#sender description#>
*/
- (IBAction)saveBtnOnClick:(UIButton *)sender; @end @implementation NJEditViewController - (void)viewDidLoad
{
[super viewDidLoad]; // 设置姓名文本输入框
self.nameField.text = _contatc.name;
// 设置电话文本输入框
self.phoneField.text = _contatc.phoneNumber; // 1.拿到通知中心
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
// 2.注册监听
// 注意点: 一定要写上通知的发布者
[center addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameField];
[center addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.phoneField]; } - (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
} - (void)textChange
{
self.saveBtn.enabled = (self.nameField.text.length > &&
self.phoneField.text.length > );
} /*
因为控制器的view是懒加载的, 用到的时候再加载
而设置模型数据是在控制器跳转之前, 此时没有用到控制器的view,
所以控制器的view还没有创建, 它的子控件也没有创建
*/
/*
- (void)setContatc:(NJContatc *)contatc
{
_contatc = contatc; NSLog(@"%p - %p", self.nameField, self.phoneField);
NSLog(@"%@ - %@", self.nameField, self.phoneField);
// 设置姓名文本输入框
self.nameField.text = _contatc.name;
// 设置电话文本输入框
self.phoneField.text = _contatc.phoneNumber;
}
*/
- (IBAction)editBtnOnClick:(UIBarButtonItem *)sender { if (self.nameField.enabled) {
// 当前是编辑状态
// 1.让文本输入框不可以交互
self.nameField.enabled = NO;
self.phoneField.enabled = NO;
// 2.隐藏保存按钮
self.saveBtn.hidden = YES;
// 3.让键盘消失
// [self.phoneField resignFirstResponder];
[self.view endEditing:YES];
// 4.修改按钮标题
sender.title = @"编辑";
// 5.还原数据
// 设置姓名文本输入框
self.nameField.text = _contatc.name;
// 设置电话文本输入框
self.phoneField.text = _contatc.phoneNumber; }else
{
// 当前是不可以编辑状态
// 1.让文本输入框可以交互
self.nameField.enabled = YES;
self.phoneField.enabled = YES;
// 2.显示保存按钮
self.saveBtn.hidden = NO;
// 3.让电话文本输入框召唤出键盘
[self.phoneField becomeFirstResponder];
// 4.修改按钮标题
sender.title = @"取消";
}
} - (IBAction)saveBtnOnClick:(UIButton *)sender { // 1.移除栈顶控制器
[self.navigationController popViewControllerAnimated:YES]; // 2.修改模型数据
NSLog(@"编辑界面 %p" , self.contatc);
self.contatc.name = self.nameField.text;
self.contatc.phoneNumber = self.phoneField.text;
// 3.通知代理
if ([self.delegate respondsToSelector:@selector(editViewControllerDidClickSavBtn:contatc:)]) {
[self.delegate editViewControllerDidClickSavBtn:self contatc:self.contatc];
} }

NJContatcsViewController.m(主控制器 实现代理方法)

#pragma mark - NJEditViewControllerDelegate
- (void)editViewControllerDidClickSavBtn:(NJEditViewController *)editViewController contatc:(NJContatc *)cpmtatc
{
// 1.修改模型
// NSIndexPath *path = [self.tableView indexPathForSelectedRow];
// self.contatcs[path.row] = cpmtatc; // 2.刷新表格
[self.tableView reloadData];
} #pragma mark - NJAddViewControllerDelegate
- (void)addViewControllerDidAddBtn:(NJAddViewController *)editViewController contatc:(NJContatc *)contatc
{
NSLog(@"添加了新联系人 %@ %@ %@", contatc.name, contatc.phoneNumber, contatc.email);
// 1.保存数据到数组中
[self.contatcs addObject:contatc];
// 2.刷新表格
[self.tableView reloadData];
}
- (NSMutableArray *)contatcs
{
if (_contatcs == nil) {
_contatcs = [NSMutableArray array];
}
return _contatcs;
}


IOS 控制器的数据传递 (顺传 and 逆传)的更多相关文章

  1. iOS边练边学--通讯录练习之Segue使用,控制器的数据传递

    一.什么是segue Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) 二.Segue的属性 每一个segue对象,都有三个属性 < ...

  2. [iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储

    A.需求 1.搭建一个"私人通讯录"Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改)   这个代码 ...

  3. iOS:控制器间的数据传递

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

  4. iOS开发中视图控制器ViewControllers之间的数据传递

    iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...

  5. Asp.Net Mvc 控制器与视图的数据传递

    数据传递也就是控制器和视图之间的交互,比如在视图中提交的数据,在控制器怎么获取,或者控制器从业务层获得一些数据,怎么传递到视图中,让视图显示在客户端呢?带着这些疑问,我们接着看..        下面 ...

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

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  7. 5.MVC框架开发(强类型开发,控制器向界面传递数据的几种方法)

    界面表单中的表单元素名字和数据库表的字段名相一一映射(需要哪个表的数据就是那个表的模型(Model)) 在View页面中可以指定页面从属于哪个模型 注:以上的关系可以通过MVC的强类型视图开发来解决我 ...

  8. Modal实现页面跳转和控制器数据传递

    一.Model跳转的实现 1.新建工程 2.新建View控制器和导航控制器 (1)为拖控件,两个view一个navigation; 如图: (2)view的“GotoTwo”按键添加Segues到Na ...

  9. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

随机推荐

  1. Black Beauty

    Chapter 1 My Early Home While I was young, I live upon my mother's milk, as I could not eat grass. W ...

  2. bzoj1934: [Shoi2007]Vote 善意的投票(最小割)

    传送门 考虑源点为同意,汇点为反对,那么只要源点向同意的连边,不同意的向汇点连边,求个最小割就是答案 然后考虑朋友之间怎么办,我们令朋友之间连双向边.这样不管怎么割都能对应一种选择情况.那么还是求一个 ...

  3. Zookeeper下载方法

    Zookeeper官网地址:http://zookeeper.apache.org/             Zookeeper下载链接:http://mirrors.tuna.tsinghua.ed ...

  4. POJ1022 Packing Unit 4D Cubes

    题目来源:http://poj.org/problem?id=1022 题目大意: 有一些4维的单位体积的立方体盒子,每个立方体有8个面.要用一个大的4为盒子将它们包起来,求最小的大盒子体积. 输入: ...

  5. Android Studio模拟器的root权限

    前言 一个安卓练习中用自带的sqlite3数据库查看数据的时候,需要通过adb shell进入/data/data/[包名]/databases/目录中,通过查看创建的数据库来查看相应的数据或者表.起 ...

  6. TcxGrid Column动态添加Image

    MyCol := TcxColumn.Create; ... MyCol.PropertiesClass := TcxImageProperties; ImageProps := TcxImagePr ...

  7. svn更改账户信息

    原svn账户清除,及使用新用户名密码操作方法 第一步:先清除原svn账户信息,如图示,电脑桌面右击"ToroiseSVN--Settings". 在Settings中,选择Save ...

  8. PartTime_网址_国外

    https://www.douban.com/group/topic/6248314/ 国外威客网站大全 国外兼职网站,以及国外外包网站.这些国外项目网站包括的项目类型很多:logo设计.图形设计.f ...

  9. SpringMVC(二)高级应用

    一.参数绑定-----集合类型 二.数据回显(例如提交表单失败了,数据没有丢失) 三.上传图片 四.json数据的交互 五.restful 支持 六.拦截器

  10. 联想电脑Fn+F6禁用触摸板功能不管用

    我的原因是电脑没有安装触摸板驱动,解决方法:去联想官网根据自己的主机编号下载适合自己的触摸板驱动,安装重启即可解决