開發中傳值司空見慣,今天來好好總結一下,一共七種傳值方式,且聽我們爲大家娓娓道來。
第一種、通知傳值——NSNotificationCenter。
/**
通知傳值的方式就類似我們廣播,
第一、廣播基站需要建設——————我們的消息中需要註冊
第二、衆所周知只有我們知道了廣播的頻段我們才能接受這個廣播基站發送的消息——————我們的消息接收者需要知道我們消息的名字才能接收
第三、廣播基站發送消息——————我們的消息中心發送通知,通知內容存放在字典模型中
第四、聽衆通過收音機聽廣播——————消息接受者通過解析數據獲得消息
第五、聽衆不聽廣播需要關閉收音機——————消息中心的銷燬
注意:需要消息的界面需要註冊通知
*/
第二種、block傳值——block。
二級界面申明,一級界面調用
#pragma mark --- block傳值
@property (nonatomic, copy) void(^returnBackValue)(NSString * backValue);
#pragma mark --- block回調
/**
@brief 多用於後一個界面向前一個界面傳值
block運用的最主要的注意點循環引用問題,block內按照下面方式寫就可以了
__weak __typeof(self) weakSelf = self;
__weak __typeof(<#實例變量#>) <#更換後的名稱#> = <#實例變量#>;
*/
passvalue.returnBackValue = ^(NSString * backValue){
NSLog(@"我們是通過block回調傳過來的值--%@",backValue);
};
第三種、屬性傳值——property。
二級界面聲明屬性,一級界面傳值,實現跳轉傳值。
#pragma mark --- 屬性傳值
@property (nonatomic,strong) NSString * propertyValue;
#pragma mark --- 屬性傳值 在PassValueController.h定義一個屬性
/**
* @brief 屬性傳值一般多用於前一個界面向後一個界面傳值
*/
passvalue.propertyValue = @"我們是通過屬性傳過來的值";
第四種、代理傳值——Delegate。
需要傳值的界面在.h文件申明協議、定義協議方法、協議屬性。
@protocol passValueDelegate <NSObject>
- (void)returnBackValue:(NSString *)backValue;
@end
@property (nonatomic,assign) id<passValueDelegate>delegate;
然後在.m文件中讓代理實現方法。
// 代理回調傳值
if ([self.delegate conformsToProtocol:@protocol(passValueDelegate)] && [self.delegate respondsToSelector:@selector(returnBackValue:)]) {
[self.delegate returnBackValue:_textFiled.text];
}
要想拿到代理的值,必須先成爲其代理。
#pragma mark --- 拿到代理
passvalue.delegate = self;
最後實現其代理方法即可
#pragma mark --- 代理傳值回調
/**
代理傳值需要消息的界面需要遵循協議,然後實現協議的方法即可
*/
-(void)returnBackValue:(NSString *)backValue{
NSLog(@"我們是通過代理回調穿過來的值--%@",backValue);
}
第五種、單例傳值——Singleton。
首先自定義一個單例,.h文件申明方法和屬性。
+ (instancetype)defalutManager;
#pragma mark --- 單例一般都是利用屬性數值,比較簡單
@property (nonatomic,strong) NSString * singletonValue;
然後在.m文件中實現方法。
+ (instancetype)defalutManager{<pre name="code" class="objc">#pragma mark --- UIApplication傳值 我在Appdelegate裏面定義了一個屬性 AppDelegateValue
AppDelegate * app = [[UIApplication sharedApplication] delegate];
app.AppDelegateValue = @"我是UIApplication傳過來的值";
static SingletonManager * manager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ manager = [[SingletonManager alloc] init]; }); return manager;} 最後,傳值。
#pragma mark --- 自定義一個單例
SingletonManager * manager = [SingletonManager defalutManager];
manager.singletonValue = @"我是單例傳過來的值";
#pragma mark --- 單例傳值
SingletonManager * manager = [SingletonManager defalutManager];
NSLog(@"%@",manager.singletonValue);
第六種、AppDelegate傳值,與單例傳值如出一轍。首先在AppDelegate.h文件申明屬性。
@property (nonatomic,strong) NSString * AppDelegateValue;
然後就可以傳值了
#pragma mark --- UIApplication傳值 我在Appdelegate裏面定義了一個屬性 AppDelegateValue
AppDelegate * app = [[UIApplication sharedApplication] delegate];
app.AppDelegateValue = @"我是UIApplication傳過來的值";
#pragma mark --- UIApplication傳值
AppDelegate * app = [[UIApplication sharedApplication] delegate];
NSLog(@"%@",app.AppDelegateValue);
第七種、文件傳值——NSUserDefaults。
#pragma mark --- NSUserDefaults也是一個單例,只能小規模傳值
/**
NSUserDefaults可以存儲NSString,NSNumber, NSDate, NSArray, NSDictionary,自定義類可以通過NSData的方式進行存儲,當然要實現NSCoding這個protocol才行,NSObject<NSCoding>
如果系統以外閃退,數據可能不會被寫入,所以我們需要實現synchronize方法,來實現數據的同步,數據會被寫入系統的/Library/Preferences/gongcheng.plist文件中
*/
[[NSUserDefaults standardUserDefaults] setObject:@"我是NSUserDefaults傳過來的值" forKey:@"NSUserDefaults"];
[[NSUserDefaults standardUserDefaults] synchronize];
#pragma mark --- NSUserDefaults傳值
NSLog(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"NSUserDefaults"]);
傳值方式這麼多,視情況想怎麼用就怎麼用。
代碼傳送門:https://github.com/fuzongjian/KindsofPassValue
關於block傳值,這裏還有一份更加詳細的介紹:http://blog.csdn.net/fuzongjian/article/details/50570609
代碼傳送門:https://github.com/fuzongjian/FZJBlock.git