前言

  • 页面传值:

    • 复合传值

    • 单例传值

    • 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的更多相关文章

  1. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  2. iOS开发——高级技术&PassBook服务

    PassBook服务 Passbook是苹果推出的一个管理登机牌.会员卡.电影票.优惠券等信息的 工具.Passbook就像一个卡包,用于存放你的购物卡.积分卡.电影票.礼品卡等,而这些票据就是一个“ ...

  3. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  4. iOS - UIStoryboard

    前言 NS_CLASS_AVAILABLE_IOS(5_0) @interface UIStoryboard : NSObject @available(iOS 5.0, *) public clas ...

  5. IOS中调用系统的电话、短信、邮件、浏览功能

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...

  6. iOS钱包卡券开发(往钱包里面加自己的卡券)

    参考文章 https://blog.csdn.net/sz_vcp2007/article/details/60762349 https://blog.csdn.net/eqera/article/d ...

  7. iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总

    社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实 ...

  8. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  9. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

随机推荐

  1. 【原创】Nexus搭建Maven私服

    前言: 公司一般都有个自己的私服来管理各种jar包,原因大概有这么3个,分别是: 1.有的公司不能访问外网,只能通过私服来管理jar包和插件: 2.公司网速比较慢,通过公司的私服来获取jar包比较快: ...

  2. CMD设IP

    netsh interface ip set address name="本地连接"  source=static/dhcp(静态/动态) addr=192.168.3.5 mas ...

  3. unicode转码,如:\u6d4b\u8bd5转成中文“测试”

    public static void main(String[] args) { String s = "测试"; String tt = gbEncoding(s); // St ...

  4. ACM第一站————快速排序

    转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5455125.html   快速排序(Quicksort)是对冒泡排序的一种改进.   快速排序由C. A. ...

  5. HDU 4715:Difference Between Primes

    Difference Between Primes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. 下载服务器端的图片和下载excel

    #region 下载 /// <summary> /// 下载资源 /// </summary> public void Download() { SaveFileDialog ...

  7. Gson心得小笔记

    又和往常一样看项目的时候遇到了点新的东西,至少对我来说是个新的东西吧.Gson 废话不多说.个人认为Gson主要用来实现对象和json之间的转换. 例如有个person对象,想要把这个对象转化为jso ...

  8. H - Solve this interesting problem 分类: 比赛 2015-07-29 21:06 15人阅读 评论(0) 收藏

    Have you learned something about segment tree? If not, don't worry, I will explain it for you.  Segm ...

  9. JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  10. userdebug版本开机串口log打开

    在/bootable/bootloader/lk/app/mt_boot/mt_boot.c里修改: if (!has_set_p2u) { #ifdef USER_BUILD sprintf(cmd ...