iOS中协议delegate的传值注意点

1、iOS中协议的用途一般是用来进行反向传值,一般步骤如下:

1)声明协议

@protocol ThirdDalegate <NSObject>

-(void)printNum:(int)num;//自定义方法用来反向传值

@end

2)定义协议属性

@property(nonatomic,assign)id<SecondDalegate>delegate;//定义属性delegate

3)实现协议方法

//一般先判断协议方法是否已响应(即是否有其他类遵从本类的协议)

if ([self.delegaterespondsToSelector:@selector(printNum:)]) {

        [self.delegateprintNum:1];//进行传值

    }

4)代理类接收值(传值的类可以理解成委托类)

@interface ViewController ()<SecondDalegate>

- (void)viewDidLoad {

SecondViewController * second=[[SecondViewControlleralloc]init];

second.delegate=self;

}

-(void)printNum:(int)num{

  NSLog(@"%d",num);

}

ps:以上为正常情况下的协议反向传值,是最协议最常见的用法


2、但是有时候我们会想要自定义控件,类似UITableView,那么此时单纯的反向传值已经满足不了该需求,因为我们需要在初始化该控件的时候利用协议传值到该控件内部,类似UITableView的numberOfRowsInSection设置cell数量的这种方法。

1)在委托类中声明协议

@protocol ThirdDelegate <NSObject>

-(NSInteger)ViewWithNum;

@end


2)协议属性

@property(nonatomic,assign)id<ThirdDelegate>delegate;

-(instancetype)initWithFrame:(CGRect)frame andDelegate:(id)delegate;

//一般在控件初始化的时候就传入代理类,以协议方法由于顺序原因不响应

@end

3)在代理类中实现传值

@interface ViewController ()<ThirdDelegate>

- (void)viewDidLoad {

    TempView * tempV=[[TempViewalloc]initWithFrame:self.view.bounds andDelegate:self];

    [self.viewaddSubview:tempV];

}

-(NSInteger)ViewWithNum{

    return 3;

}

4)自定义控件实现初始化方法

-(instancetype)initWithFrame:(CGRect)frame andDelegate:(id)delegate{

    self=[superinitWithFrame:frame];

    if (self) {

        self.backgroundColor=[UIColorredColor];

        self.delegate=delegate;//注意点:必须先遵从协议才能响应方法  

        if ([self.delegaterespondsToSelector:@selector(ViewWithNum)]) {

          NSLog(@"%ld",(long)[self.delegateViewWithNum]);

        }

    }

    return self;

}




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值