iOS传值
许久没敲过OC了,写个多界面传值都模糊了,特总结一下:
传值模式 | 缺点 |
---|---|
代理 | 代码多,容易忽略的细节多,使用起来较麻烦 |
通知 | 注册,发送,订阅,销毁用的多了代码就乱,出bug难定位 |
Block | 推荐!注意:循环引用!循环引用!循环引用! |
单例 | 复杂 |
一、代理传值
1、在V2.h里声明一个协议CallBackDelegate,定义代理方法
@protocol CallBackDelegate <NSObject>
-(void)callBack:(NSDictionary *)userInfoDic;//要传递的参数userInfoDic
@end
@interface VC2 : UIViewController
@property (nonatomic ,weak)id<CallBackDelegate>delegate;
@end
2、在V2.m里执行代理方法进行传值操作
_userInfoDic = @{@"name":@"123",@"password":@"456"};
[self.delegate callBack:_userInfoDic];
3、在V1.m里设置代理,实现协议方法从而获得传递过来的参数
#import "VC1.h"
@interface VC1 ()<CallBackDelegate>//服从协议
@end
-(void)GotoV2{
VC2 *vc2 = [[VC2 alloc] init];
vc2.delegate = self;//设置代理
[self presentViewController:vc2 animated:YES completion:nil];
}
//调用代理方法获得传值
-(void)callBack:(NSDictionary *)userInfoDic{
NSLog(@"========代理传值>%@",userInfoDic);
}
@end
二、通知传值
1、在V2界面声明通知并带上参数发送通知
NSDictionary *userInfoDic = @{@"name":@"123",@"password":@"456"};
NSNotification *notification =[NSNotification notificationWithName:@"CallBackNotification" object:nil userInfo:userInfoDic];
2、在V1界面订阅通知,接收通知参数
- (void)viewDidLoad {
[super viewDidLoad];
//订阅通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loginCallBack:) name:@"loginCallBackNotification" object:nil];
}
-(void)loginCallBack:(NSNotification *)dic{
NSDictionary *userInfoDic = dic.userInfo;
NSLog(@"========通知传值>%@",userInfoDic);
}
3、在V1界面销毁通知
-(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
三、Block传值
1、在V2.h声明Block方法
@property (nonatomic ,strong) void(^callBackBlock)(NSDictionary *userInfoDic);
2、在V2.m声明Block执行方法并传值
NSDictionary *userInfoDic = @{@"name":@"123",@"password":@"456"};
self.callBackBlock(_userInfoDic);
3、在V1.m内接收传值
VC2 *vc2 = [[VC2 alloc] init];
vc2.callBackBlock = ^(NSDictionary * _Nonnull userInfoDic) {
NSLog(@"========Block传值>%@",userInfoDic);
四、单例传值
1、创建单例类
#import <Foundation/Foundation.h>
@interface callBackApi : NSObject
@property (nonatomic ,strong)NSDictionary *userInfoDic;
//声明方法
+(callBackApi *)callBack;
@end
2、实现单例类
#import "callBackApi.h"
static callBackApi *callBack = nil;
@implementation callBackApi
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [callBackApi callBack];
}
+(callBackApi *)callBack{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
callBack = [[super allocWithZone:nil]init];
});
return callBack;
}
@end
3、在V2.m执行单例赋值
callBackApi *callbackapi = [callBackApi callBack];
callbackapi.userInfoDic = _userInfoDic;
4、在V1.m执行单例取值
callBackApi *callbackapi = [callBackApi callBack];
NSLog(@"========单例传值1>%@",callbackapi.userInfoDic);
…
-----在此献祭Demo-----
demo地址:https://download.csdn.net/download/weixin_40770051/12527605