开发中传值司空见惯,今天来好好总结一下,一共七种传值方式,且听我们为大家娓娓道来。
第一种、通知传值——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