● 控制器之间的数据传递主要有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. SNAT端口转发配置

    需求说明 在只有外网地址的机器上也能正常访问内网地址 配置过程 环境网络信息 网络名称 网络地址 外网 192.168.200.0/24 (网关:192.168.200.251) 内网 92.0.0. ...

  2. Yahoo Progamming Contest 2019D(DP,思维)

    #include<bits/stdc++.h>using namespace std;long long n,v,a,b,c,d,e;int main(){    scanf(" ...

  3. bzoj4200: [Noi2015]小园丁与老司机(可行流+dp)

    传送门 这该死的码农题…… 题解在这儿->这里 //minamoto #include<iostream> #include<cstdio> #include<cs ...

  4. 通过sql语句对MySql数据库的基本操作

    一.数据库的基本操作 CREATE DATABASE mybookstore; DROP DATABASE mybookstore; 二.表的基本操作 1.创建表 insert into 表名(字段名 ...

  5. 关于给gridSelect控件设置默认值

    给这个选择表格框添加默认值: <td class="form_label">                            客户名称:              ...

  6. thinkphp5使用QueryList实现采集功能

    QueryList是基于phpQuery的 1.下载`QueryList.php`和`phpQuery.php`这两个文件. 2.在`extend`下新建`QL`目录. 3.将下载好的`QueryLi ...

  7. win下rabbitmq的安装

    安装erlang 10.4 和 rabbitmq 3.7.5 然后关闭rabbitmq服务 然后设置 erlang和rabbitmq的环境变量 ERLANG_HOME=erlang安装目录 RABBI ...

  8. POJ1024 Tester Program

    题目来源:http://poj.org/problem?id=1024 题目大意: 有一个迷宫,迷宫的起点在(0,0)处.给定一条路径,和该迷宫墙的设置,要求验证该路径是否为唯一的最短路径,该种墙的设 ...

  9. 使用命令行+代理更新Android SDK

    在无桌面的Linux上面安装Jenkins,要配置成Andorid 的持续集成环境Jenkins持续集成Android项目,需要在无桌面的Linux(ubuntu,centos)上安装Android ...

  10. PIE使IE浏览器支持CSS3属性(圆角、阴影、渐变)

    http://www.360doc.com/content/12/1214/09/11181348_253939277.shtml PIE使IE浏览器支持CSS3属性(圆角.阴影.渐变) 2012-1 ...