iOS - PassData
前言
页面传值:
复合传值
单例传值
userDefaults 传值
代理传值
Block/闭包传值
1、复合传值
复合 - 正向传值
- 1、接收方,头文件中创建可存放传递值的属性变量
- 2、发送方,包含接收方的头文件
- 3、发送方,实例化接收方对象,并设置其属性变量的值
- 4、接收方,将此属性变量的值输出
Objective-C
Page2.h
// 1、接收方,头文件中创建可存放传递值的 “属性变量”
@property(nonatomic, copy)NSString *receiveText;
Page1.m
// 2、发送方,包含接收方的头文件
#import "Page2.h" // 3、发送方,实例化接收方对象,并设置其 “属性变量” 的值
Page2 *pvc2 = [[Page2 alloc] init]; pvc2.receiveText = sendTextFiled.text;
Page2.m
// 4、接收方,将此 “属性变量” 的值输出
receiveLabel.text = self.receiveText;
Swift
Page2.swift
// 1、接收方,头文件中创建可存放传递值的 “属性变量”
var receiveText:String?
Page1.swift
// 3、发送方,实例化接收方对象,并设置其 “属性变量” 的值
let pvc2 = Page2() pvc2.receiveText = sendTextFiled.text;
Page2.swift
// 4、接收方,将此 “属性变量” 的值输出
receiveLabel.text = self.receiveText
2、单例传值
单例 - 正/反向传值
1、创建单例类,并在其头文件中创建可存放传递值的属性变量
2、发送方,包含单例类头文件
3、发送方,创建单例类对象,并为其属性变量赋值
4、接收方,包含单例类头文件
5、接收方,创建单例类对象,取其属性变量的值,输出
Objective-C
创建单例类
SingleClass.h
#import <Foundation/Foundation.h> @interface SingleClass : NSObject // 1、创建单例类,并在其头文件中创建可存放传递值的 “属性变量”
@property (nonatomic, copy)NSString *singleText; + (SingleClass *)sharedSingleClass; @end
SingleClass.m
#import "SingleClass.h" @implementation SingleClass + (SingleClass *)sharedSingleClass { static SingleClass *single = nil; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [[SingleClass alloc] init];
});
return single;
} @end
Page3.m
// 2、发送方,包含单例类头文件
#import "SingleClass.h" // 3、发送方,创建单例类对象,并为其 “属性变量” 赋值
[SingleClass sharedSingleClass].singleText = sendTextFiled.text;
Page4.m
// 4、接收方,包含单例类头文件
#import "SingleClass.h" // 5、接收方,创建单例类对象,取其 “属性变量” 的值,输出
receiveLabel.text = [SingleClass sharedSingleClass].singleText;
Swift
创建单例类
SingleClass.swift
import UIKit class SingleClass { // 1、创建单例类,并创建可存放传递值的 “属性变量”
var singleText:String? static let sharedSingleClass = SingleClass()
private init() {}
}
Page3.swift
// 3、发送方,创建单例类对象,并为其 “属性变量” 赋值
SingleClass.sharedSingleClass.singleText = sendTextFiled.text
Page4.swift
// 5、接收方,创建单例类对象,取其 “属性变量” 的值,输出
receiveLabel.text = SingleClass.sharedSingleClass.singleText
3、NSUserDefaults 传值
NSUserDefaults - 正/反向传值
1、发送方,创建 userDefaults,并以一个固定的 key 值存储数据,发送传递值
2、发送方,创建 userDefaults 同步数据
3、接收方,创建 userDefaults,并以相同的 key 值读取数据,接收传递值
Objective-C
Page5.m
// 1、发送方,创建 userDefaults,并以一个固定的 key 值存储数据,发送传递值
[[NSUserDefaults standardUserDefaults] setObject:sendTextFiled.text forKey:@"userDefaultsText"]; // 2、发送方,创建 userDefaults 同步数据
[[NSUserDefaults standardUserDefaults] synchronize];
Page6.m
// 3、接收方,创建 userDefaults,并以相同的 key 值读取数据,接收传递值
receiveLabel.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"userDefaultsText"];
Swift
Page5.swift
// 1、发送方,创建 userDefaults,并以一个固定的 key 值存储数据,发送传递值
NSUserDefaults.standardUserDefaults().setObject(sendTextFiled.text, forKey: "userDefaultsText") // 2、发送方,创建 userDefaults 同步数据
NSUserDefaults.standardUserDefaults().synchronize()
Page6.swift
// 3、接收方,创建 userDefaults,并以相同的 key 值读取数据,接收传递值
receiveLabel.text = NSUserDefaults.standardUserDefaults().objectForKey("userDefaultsText") as? String
4、代理传值
4.1 代理反向传值
代理 - 反向传值
1、创建代理协议,并在协议中创建协议方法
2、委托方:发送方,包含协议头文件
3、委托方:发送方,创建代理人属性变量
4、委托方:发送方,调用协议方法,发送传递值
5、代理方:接收方,遵守代理协议
6、代理方:接收方,实例化发送方对象,并设置其代理人为 self
7、代理方:接收方,实现代理协议中的方法,接收传递值
Objective-C
创建协议
PageDelegate1.h
#import <Foundation/Foundation.h> @protocol PageDelegate1 <NSObject> // 1、创建代理协议,并在协议中创建协议方法
- (void)setLabelWithText:(NSString *)protocolText; @end
Page8.h
// 2、委托方:发送方,包含协议头文件
#import "PageDelegate1.h" // 3、委托方:发送方,创建代理人属性变量
@property(nonatomic, weak)id<PageDelegate1> delegate;
Page8.m
if ([self.delegate respondsToSelector:@selector(setLabelWithText:)]) { // 4、委托方:发送方,调用协议方法,发送传递值
[self.delegate setLabelWithText:sendTextFiled.text];
}
Page7.m
// 5、代理方:接收方,遵守代理协议
@interface Page7 () <PageDelegate1> // 6、代理方:接收方,实例化发送方对象,并设置其代理人为 self
Page8 *pvc8 = [[Page8 alloc] init]; pvc8.delegate = self; // 7、代理方:接收方,实现代理协议中的方法,接收传递值
- (void)setLabelWithText:(NSString *)protocolText { receiveLabel.text = protocolText;
}
Swift
创建协议
PageDelegate1.swift
import Foundation protocol PageDelegate1 { // 1、创建代理协议,并在协议中创建协议方法
func setLabelWithText(protocolText:String?)
}
Page8.swift
// 3、委托方:发送方,创建代理人属性变量
var delegate:PageDelegate1! if self.delegate != nil { // 4、委托方:发送方,调用协议方法,发送传递值
self.delegate.setLabelWithText(sendTextFiled.text)
}
Page7.swift
// 5、代理方:接收方,遵守代理协议
class Page7: UIViewController, PageDelegate1 { // 6、代理方:接收方,实例化发送方对象,并设置其代理人为 self
let pvc8 = Page8() pvc8.delegate = self // 7、代理方:接收方,实现代理协议中的方法,接收传递值
func setLabelWithText(protocolText: String?) { receiveLabel.text = protocolText
}
4.2 代理反向传值封装
代理 - 反向传值,代理封装
1、创建代理协议,并在协议中创建协议方法
2、委托方:发送方,包含协议头文件
3、委托方:发送方,创建代理人属性变量
4、委托方:发送方,声明重构的 init 初始化方法
5、委托方:发送方,重构 init 初始化方法
6、委托方:发送方,调用协议方法,发送传递值
7、代理方:接收方,遵守代理协议
8、代理方:接收方,用重构初始化方法实例化委托方对象,并设置其代理人为 self
9、代理方:接收方,实现代理协议中的方法,接收传递值
Objective-C
创建协议
PageDelegate2.h
#import <Foundation/Foundation.h> @protocol PageDelegate2 <NSObject> // 1、创建代理协议,并在协议中创建协议方法
- (void)setLabelWithText:(NSString *)protocolText; @end
Page10.h
// 2、委托方:发送方,包含协议头文件
#import "PageDelegate2.h" // 3、委托方:发送方,创建代理人属性变量
@property(nonatomic, weak)id<PageDelegate2> delegate; // 4、委托方:发送方,声明重构的 init 初始化方法
- (instancetype)initWithTarget:(id<PageDelegate2>) delegate;
Page10.m
// 重构的 init 初始化方法
// 5、委托方:发送方,重构 init 初始化方法
- (instancetype)initWithTarget:(id<PageDelegate2>)delegate { if (self = [super init]) { self.delegate = delegate;
}
return self;
} if ([self.delegate respondsToSelector:@selector(setLabelWithText:)]) { // 6、委托方:发送方,调用协议方法,发送传递值
[self.delegate setLabelWithText:sendTextFiled.text];
}
Page9.m
// 7、代理方:接收方,遵守代理协议
@interface Page9 () <PageDelegate2> // 8、代理方:接收方,用重构初始化方法实例化委托方对象,并设置其代理人为 self
Page10 *pvc10 = [[Page10 alloc] initWithTarget:self]; // 9、代理方:接收方,实现代理协议中的方法,接收传递值
- (void)setLabelWithText:(NSString *)protocolText { receiveLabel.text = protocolText;
}
Swift
创建协议
PageDelegate2.swift
import Foundation protocol PageDelegate2 { // 1、创建代理协议,并在协议中创建协议方法
func setLabelWithText(protocolText:String?)
}
Page10.swift
// 3、委托方:发送方,创建代理人属性变量
var delegate:PageDelegate2! // 重构的 init 初始化方法
// 5、委托方:发送方,重构 init 初始化方法
init(target delegate:PageDelegate2) { // 在 ViewController 中不能使用 super.init()
super.init(nibName: nil, bundle: nil) self.delegate = delegate
} if self.delegate != nil { // 6、委托方:发送方,调用协议方法,发送传递值
self.delegate.setLabelWithText(sendTextFiled.text)
}
Page9.swift
// 7、代理方:接收方,遵守代理协议
class Page9: UIViewController, PageDelegate2 { // 8、代理方:接收方,实例化发送方对象,并设置其代理人为 self
let pvc10 = Page10(target: self) // 9、代理方:接收方,实现代理协议中的方法,接收传递值
func setLabelWithText(protocolText: String?) { receiveLabel.text = protocolText
}
4.3 代理双向传值
代理 - 双向传值
Objective-C
创建协议
PageDelegate3.h
#import <Foundation/Foundation.h> @protocol PageDelegate3 <NSObject> // 带返回值
- (NSString *)setLabelWithText:(NSString *)protocolText; @end
Page16.h
#import "PageDelegate3.h" @property(nonatomic, weak)id<PageDelegate3> delegate;
Page16.m
- (void)viewDidLoad { if ([self.delegate respondsToSelector:@selector(setLabelWithText:)]) { // 接收数据
receiveLabel.text = [self.delegate setLabelWithText:nil];
}
} // 返回上一页
- (void)sendClick { if ([self.delegate respondsToSelector:@selector(setLabelWithText:)]) { // 返回数据
[self.delegate setLabelWithText:sendTextFiled.text];
} [self dismissViewControllerAnimated:YES completion:nil];
}
Page15.m
@interface Page15 () <PageDelegate3> Page16 *pvc16 = [[Page16 alloc] init]; pvc16.delegate = self; - (NSString *)setLabelWithText:(NSString *)protocolText { // 接收返回的数据
receiveLabel.text = protocolText; // 正向发送数据
return sendTextFiled.text;
}
5、Block/闭包 传值
5.1 block/闭包反向传值
block/闭包 - 反向传值
1、发送方:创建 block/闭包 类型的变量
2、发送方:调用 block/闭包,发送传递值
3、接收方:实例化发送方对象,并实现其 block/闭包,接收传递值
Objective-C
Page12.h
// 1、发送方:创建 block 类型的变量,变量名为 passDataBlock
@property (nonatomic, copy)void (^passDataBlock)(NSString *);
Page12.m
if (self.passDataBlock) { // 2、发送方:调用 block,发送传递值
self.passDataBlock(sendTextFiled.text);
}
Page11.m
// 3、接收方:实例化发送方对象,并实现其 block,接收传递值
Page12 *pvc12 = [[Page12 alloc] init]; pvc12.passDataBlock = ^(NSString *blockText){ receiveLabel.text = blockText;
};
Swift
Page12.swift
// 1、发送方:创建闭包类型的变量
var passDataClosure:((String?) -> Void)! if self.passDataClosure != nil { // 2、发送方:调用闭包,发送传递值
self.passDataClosure(sendTextFiled.text)
}
Page11.swift
// 3、接收方:实例化发送方对象,并实现其闭包,接收传递值
let pvc12 = Page12() pvc12.passDataClosure = { (closureText:String?) in self.receiveLabel.text = closureText
}
5.2 block/闭包反向传值封装
block/闭包 - 反向传值,block/闭包 封装
1、发送方:创建 block/闭包 类型的变量
2、发送方:声明重构 init 初始化方法
3、发送方:重构 init 初始化方法
4、发送方:调用 block/闭包,发送传递值
5、接收方:用重构初始化方法实例化发送方对象,并实现其 block/闭包,接收传递值
Objective-C
Page14.h
typedef void (^pagePassDataBlock)(NSString *); // 1、发送方:创建 block 类型的变量,变量名为 passDataBlock
@property (nonatomic, copy)pagePassDataBlock passDataBlock; // 2、发送方:声明重构 init 初始化方法
- (instancetype)initWithBlock:(pagePassDataBlock)dataBlock;
Page14.m
// 重构 init 初始化方法
// 3、发送方:重构 init 初始化方法
- (instancetype)initWithBlock:(pagePassDataBlock)dataBlock { if (self = [super init]) { self.passDataBlock = dataBlock;
}
return self;
} if (self.passDataBlock) { // 4、发送方:调用 block,发送传递值
self.passDataBlock(sendTextFiled.text);
}
Page13.m
// 5、接收方:用重构初始化方法实例化发送方对象,并实现其 block,接收传递值
Page14 *pvc14 = [[Page14 alloc] initWithBlock:^(NSString *blockText) { receiveLabel.text = blockText;
}];
Swift
Page14.swift
// 1、发送方:创建闭包类型的变量
var passDataClosure:((String?) -> Void)! // 重构 init 初始化方法
// 3、发送方:重构 init 初始化方法
init(closure:((String?) -> Void)) { super.init(nibName: nil, bundle: nil) self.passDataClosure = closure
} if self.passDataClosure != nil { // 4、发送方:调用闭包,发送传递值
self.passDataClosure(sendTextFiled.text)
}
Page13.swift
let pvc14 = Page14 { (closureText:String?) in // 5、接收方:用重构初始化方法实例化发送方对象,并实现其 block/闭包,接收传递值
self.receiveLabel.text = closureText
}
5.3 block/闭包双向传值
block/闭包 - 双向传值
Objective-C
Page18.h
// 带返回值
@property (nonatomic, copy)NSString * (^passDataBlock)(NSString *);
Page18.m
- (void)viewDidLoad {
[super viewDidLoad]; if (self.passDataBlock) { // 接收数据
receiveLabel.text = self.passDataBlock(nil);
}
} // 返回上一页
- (void)sendClick { if (self.passDataBlock) { // 返回数据
self.passDataBlock(sendTextFiled.text);
} [self dismissViewControllerAnimated:YES completion:nil];
}
Page17.m
Page18 *pvc18 = [[Page18 alloc] init]; pvc18.passDataBlock = ^(NSString * blockText){ // 接收返回的数据
receiveLabel.text = blockText; // 正向发送数据
return sendTextFiled.text;
};
iOS - PassData的更多相关文章
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发——高级技术&PassBook服务
PassBook服务 Passbook是苹果推出的一个管理登机牌.会员卡.电影票.优惠券等信息的 工具.Passbook就像一个卡包,用于存放你的购物卡.积分卡.电影票.礼品卡等,而这些票据就是一个“ ...
- iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS - UIStoryboard
前言 NS_CLASS_AVAILABLE_IOS(5_0) @interface UIStoryboard : NSObject @available(iOS 5.0, *) public clas ...
- IOS中调用系统的电话、短信、邮件、浏览功能
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...
- iOS钱包卡券开发(往钱包里面加自己的卡券)
参考文章 https://blog.csdn.net/sz_vcp2007/article/details/60762349 https://blog.csdn.net/eqera/article/d ...
- iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总
社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实 ...
- iOS可视化动态绘制连通图
上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
随机推荐
- Java transient关键字序列化时使用小记
1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...
- 杭电1097-A hard puzzle
Problem Description lcy gives a hard puzzle to feng5166,lwg,JGShining and Ignatius: gave a and b,how ...
- sscanf 函数 分类: POJ 2015-08-04 09:19 4人阅读 评论(0) 收藏
sscanf 其实很强大 分类: 纯C技术 技术笔记 2010-03-05 16:00 12133人阅读 评论(4) 收藏 举报 正则表达式stringbuffercurlgoogle 最近在做日志分 ...
- 山东理工大学第七届ACM校赛-飞花的糖果 分类: 比赛 2015-06-26 10:27 15人阅读 评论(0) 收藏
飞花的糖果 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 一日,飞花壕大手一挥,买了N个的两两不相同糖果,他想要拿出M个糖果送给他心仪 ...
- c++map的用法 分类: POJ 2015-06-19 18:36 11人阅读 评论(0) 收藏
c++map的用法 分类: 资料 2012-11-14 21:26 10573人阅读 评论(0) 收藏 举报 最全的c++map的用法 此文是复制来的0.0 1. map最基本的构造函数: map&l ...
- 关于List.ToArray()方法的效率测试
之前一直认为因为List内部是数组,ToArray的实现只是将数组返回出去而已. 今天测了一下发现并不是那样 var a = new List<int>(); ; i < ; i++ ...
- 一种奇特的DEDE隐藏后门办法
转自:http://www.91ri.org/6462.html 一种奇特的DEDE隐藏后门办法 单位某站用的dedecms,今天被某黑阔getshell了,提交到了wooyun. 为了还原黑阔入 ...
- JavaScript的构造器与对象(二)
constructor 的用法:对象的构造函数 每一个函数的Prototype属性指向的对象都包含唯一一个不可枚举属性constructor,该属性的值是这么一个对象:它指向了它所在的构造函数. 语 ...
- 2016年7月1日 星期五 --出埃及记 Exodus 14:28
2016年7月1日 星期五 --出埃及记 Exodus 14:28 The water flowed back and covered the chariots and horsemen--the e ...
- VC++ 利用MAPI实现在程序中调用默认的电子邮件程序发送EMAIL(可以添加附件)。
1.利用ShellExecute 可以条用默认邮件客户端,但不能发送带附件的邮件 mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文 如:ShellExe ...