页面之间数据回传常用方式

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"];

}

方法还有很多 这几种是量级比较小的 简单易用的传值方式