● 控制器之间的数据传递主要有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. 虚拟创建失败之Dbus调试

    DBus调试命令 查询连接名 ### 查询所有连接名 # dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.free ...

  2. Java面向对象的三大特性 继承

    继承是类与类的一种关系,是“is a"关系  子类拥有父类的属性和方法,private除外 class 子类 extends 父类   方法的重写 调用方法时会优先调用子类的方法 重写时,返 ...

  3. 如何在MySQL中设置外键约束

    引用:http://blog.sina.com.cn/s/blog_53729e4601011wja.html MySql外键设置详解   (1) 外键的使用: 外键的作用,主要有两个:    一个是 ...

  4. All Roads Lead to Rome(30)(MAP【int,string】,邻接表,DFS,模拟,SPFA)(PAT甲级)

    #include<bits/stdc++.h>using namespace std;map<string,int>city;map<int,string>rcit ...

  5. SQL Server 2012 安装——安装 OR 卸载

    前言     上篇介绍了.net framework 3.5的安装,这次介绍一下,SQL Server2012的安装和彻底卸载.根据百度,下面是自己根据自己实际情况整理的安装步骤: 安装 见安装步骤( ...

  6. K8S上的ELK和应用日志上报实战

    来源:DevOps ID:Idevops168 本次实战的基础结构如下图所示: 一共有两个Pod:ELK和web应用: ELK的Pod会暴露两个服务,一个暴露logstash的5044端口,给file ...

  7. Java 8 Optional类使用的实践经验

    前言 Java中空指针异常(NPE)一直是令开发者头疼的问题.Java 8引入了一个新的Optional类,使用该类可以尽可能地防止出现空指针异常. Optional 类是一个可以为null的容器对象 ...

  8. 厉害了,Dubbo 正式毕业!

    厉害了,2019/05/21 Apache软件基金会发表博文,宣布 Dubbo 在 2019/05/20 这天正式毕业,成为 Apache 的顶级项目. 参考:https://blogs.apache ...

  9. React的核心概念

    1.JSX的语法(javascript和XML结合的语法) 2.元素渲染(页面渲染) 3.组件 创建组件和组件之间传参 4.props属性 是父元素(父组件传递给子组件的值)和state状态(子组件自 ...

  10. Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT

    好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...