ios传值多种方法的使用

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

暂时就这些呗,属性传值就不写了。有大神发现问题或者有补充的欢迎留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值