页面之间数据回传常用方式
block方式
.h 文件中
typedef void(^ResponseBlock)(NSString *);
//定义一个block属性,使用copy策略
@property(nonatomic, copy)ResponseBlock block;
也可以直接定义
@property(nonatomic, copy)(void(^)(NSString *)) block;
//.m文件中 需要的地方回调block
if (self.block != nil) {
self.block(@"string");
}
//在需要回传值的地方 调用
__weak typeof(self) weakSelf = self;
myView.block = ^(NSString *text) {
__strong typeof (weakSelf) strongSelf =weakSelf;
[strongSelf run];
NSLog(@"%@", text)
};
单例
因为单利只会创建一次对象,因此任何地方创建调用它们的属性 都具有唯一性
//第一种常用方式
+(UserInfo *)shareInstance{
static UserInfo *userInfo = nil;
static dispatch_once_t = onceToken;
dispatch_once(&onceToken,^{
userInfo = [[self alloc] init];
})
return userInfo;
}
//第二种常用方式
+(UserInfo *)shareInstance{
static UserInfo *userInfo = nil;
if (userInfo == nil) {
userInfo = [[self alloc] init];
}
return userInfo;
}
代理模式
//.h 中定义一组协议方法,让代理对象去实现 可以很多方法
@protocol RegistDelegate <NSObject>
- (void)registQQNumber:(NSString *)qqNumber withPassWorld:(NSString *)passWorld;
@end
// 包含一个代理对象属性,用于接收实现协议方法的代理对象
@property(assign, nonatomic)id <RegistDelegate> delegate;
//需要调用的地方 创建对象 设置代理方法
RegistController *reg = [[RegistController alloc] init];
reg.delegate = self;
#pragma mark - 实现注册类的代理方法
- (void)registQQNumber:(NSString *)qqNumber withPassWorld:(NSString *)passWorld
{
NSLog(@"qqNumber:%@,passWorld:%@", qqNumber, passWorld)
}
KVO
/*
Key_Value_Coding,键值编码
用于修改属性的值,如果属性是有对应的set方法,那么会优先调用set方法,如果没有就会强行赋值
*/
[self setValue:qqText forKey:@"qqNumber"];
// 要触发KVO,就必须使用set方法赋值或者使用KVC赋值
self.passWorld = passText;
// 这样赋值是不能触发KVO
// _qqNumber = qqText;
----------------------------------------------------
//需要使用的地方 添加监听
RegistViewController *reg = [[RegistViewController alloc] init];
/* KVO : KeyValueObserv
KeyPath: 监听属性的名称
options: 要监听新值还是旧值
NSKeyValueObservingOptionNew // 新值
NSKeyValueObservingOptionOld // 旧值
context: 传递的数据
*/
[reg addObserver:self forKeyPath:@"qqNumber" options:NSKeyValueObservingOptionNew
|NSKeyValueObservingOptionOld context:NULL];
[reg addObserver:self forKeyPath:@"passWorld" options:NSKeyValueObservingOptionNew
|NSKeyValueObservingOptionOld context:NULL];
#pragma mark - KVO监听到属性值改变后触发的方法
- (void)observeValueForKeyPath:(NSString *)keyPath //监听的属性名称
ofObject:(id)object // 被监听的对象
change:(NSDictionary *)change // 监听属性的值
context:(void *)context // 添加监听时传来的值
{
// 首先区别是那个属性值改变触发的方法
if ([keyPath isEqualToString:@"qqNumber"]) {
// 获取属性的最新值 [change objectForKey:@"new"]
// 获取属性的旧值 [change objectForKey:@"old"]
NSString *userInfo = [change objectForKey:@"new"];
qqTextField.text = userInfo;
} else if([keyPath isEqualToString:@"passWorld"])
{
NSString *userInfo = [change objectForKey:@"new"];
passField.text = userInfo;
}
}
other Linker Flags 把 -all_load去掉,就可以正常运行了。
通知
通知是app全局通知 如非必要 选用上面的方法
//发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:
LoginSuccessNotification object:nil userInfo:dic];
//添加监听
[[NSNotificationCenter defaultCenter] addObserverForName:
LoginSuccessNotification object:nil queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSLog(@"%@", note.userInfo)
}];
//删除监听
[[NSNotificationCenter defaultCenter] removeObserver:self
name:LoginSuccessNotification object:nil];
本地存储
- (NSString*)dictionaryToJson:(NSDictionary *)dic
{
//存
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"123456" forKey:@"uid"];
[userDefaults synchronize];
//取
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid = [defaults valueForKey:@"uid"];
}
方法还有很多 这几种是量级比较小的 简单易用的传值方式