关于delegate的理解:是一种设计模式即代理模式,可以去参考中介找房案例来理解代理模式,说一下个人的理解吧:我理解的代理模式就是我需要做一件事但是我又没有时间或者有一部分条件并不具备,所以我需要别人来完成,而我需要告诉他我要做什么,至于如何让完成是他的事情
代理最常用的的用法就是逆向传值,下面通过一个小demo来看一下具体怎么用
实现的功能:我有两个页面,我先当前VC: MeViewController 通过按钮跳转到下一个VC:TestViewController,该VC上面三个按钮,每当我点击一个按钮是退回到上一个VC,并且在 VC: MeViewController 的label上显示我点击的按钮是第几个,即将我点击的按钮的值传递给上一个界面。
代码实现:
1.创建协议
//import "TestViewController.h":
@protocol TestViewControllerDelegate <NSObject>
// 让协议方法带参传值
/**传递的值*/
- (void) showMeTarget:(NSInteger ) value;
@end
2.声明委托变量
//import "TestViewController.h":
@interface TestViewController : UIViewController
@property (nonatomic, weak) id <TestViewControllerDelegate> delegate;
@end
至于为啥用weak 以后说到内存管理再说
3.设置代理 因为我是在MeViewController里面跳转的时候设置的,所以在MeViewController.h中
// #import "MeViewController.h"
- (void)jumpButtonDidClick {
TestViewController *vc = [[TestViewController alloc]init];
vc.title = @"跳转页面";
vc.delegate = self;
[self.navigationController pushViewController:vc animated:YES];
}
4.利用委托变量来调用协议方法,也就是将值传递过去让代理者开始执行协议
//import "TestViewController.h":
- (void) buttonDidClick:(UIButton *)btn {
if([self.delegate respondsToSelector:@selector(showMeTarget:)]) {
[self.delegate showMeTarget:btn.tag];
}
[self.navigationController popViewControllerAnimated:YES];
}
5.在代理MeViewController中遵守协议
@interface MeViewController ()<TestViewControllerDelegate,NSURLSessionDataDelegate>
@property (nonatomic,strong) UIButton *jumpButton;
@property (nonatomic,strong)UILabel *label;
@end
6.代理实现协议方法
- (void)showMeTarget:(NSInteger)value {
self.label.text = [NSString stringWithFormat:@"点击了第%ld个按钮",value];
}
嗯,看一下效果: