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;@endSingleClass.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 UIKitclass SingleClass {// 1、創建單例類,并創建可存放傳遞值的 “屬性變量”var singleText:String?static let sharedSingleClass = SingleClass()private init() {}}
Page3.swift
// 3、發送方,創建單例類對象,并為其 “屬性變量” 賦值SingleClass.sharedSingleClass.singleText = sendTextFiled.textPage4.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、代理方:接收方,實例化發送方對象,并設置其代理人為 selfPage8 *pvc8 = [[Page8 alloc] init];pvc8.delegate = self;// 7、代理方:接收方,實現代理協議中的方法,接收傳遞值- (void)setLabelWithText:(NSString *)protocolText {receiveLabel.text = protocolText;}
Swift
創建協議
PageDelegate1.swift
import Foundationprotocol 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、代理方:接收方,實例化發送方對象,并設置其代理人為 selflet 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、代理方:接收方,用重構初始化方法實例化委托方對象,并設置其代理人為 selfPage10 *pvc10 = [[Page10 alloc] initWithTarget:self];// 9、代理方:接收方,實現代理協議中的方法,接收傳遞值- (void)setLabelWithText:(NSString *)protocolText {receiveLabel.text = protocolText;}
Swift
創建協議
PageDelegate2.swift
import Foundationprotocol 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、代理方:接收方,實例化發送方對象,并設置其代理人為 selflet 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?) inself.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的全部內容,希望文章能夠幫你解決所遇到的問題。