简介
代理在开发过程中比较常见,像<UITableViewDelegate>就是系统自带的协议,代理一般用来页面间传值,传递事件,接下来通过页面间传值来简单讲一下代理的使用方法。
页面间传值
首先明确一下目的,A控制器跳转到B控制器,再从B控制跳转回来,并且带回一个值。
第一步:在B控制器声明一份协议
@protocol BViewControllerDelegate <NSObject>// 一般用控制器名+Delegate命名
- (void)returnString:(NSString *)str;// 代理方法 返回一个字符串
@end
第二步:声明一个代理属性
@property (nonatomic, weak) id<BViewControllerDelegate> delegate;
第三步:在跳转回A控制的方法里写代理执行方法(这里用了模态跳转)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 判断代理方法是否存在
if ([self.delegate respondsToSelector:@selector(returnString:)]) {
[self.delegate returnString:@"回传数据"];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
第四步:在A控制器里签订代理
@interface ViewController () <BViewControllerDelegate>
第五步:签订代理人
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
BViewController *VC = [BViewController new];
VC.delegate = self; // 这步是签订代理人
[self presentViewController:VC animated:YES completion:nil];
}
第六步:实现代理方法
- (void)returnString:(NSString *)str
{
NSLog(@"%@", str);
}
这样一个代理传值就写完了,能实现页面间的传值,下面我们来想一下,如果一个页面可以跳转到多个页面,就像首页,而且返回的时候都要做不同的动作(例如:刷新数据,更新某个UI,等等),那么所有页面都写一个代理的话,首页就需要实现多个代理方法,这可能不是我们想要的,接下来就来讲讲Protocol文件。
首先创建一个Objective-C File文件
屏幕快照 2017-07-04 下午1.59.00.png
然后文件类型选择Protocol
屏幕快照 2017-07-04 下午1.59.46.png
创建出来的文件只有.h文件,然后写上代理方法,这个文件就结束了。
@protocol DoSomething <NSObject>
- (void)doSomethingWith:(NSString *)type;
@end
然后去需要回调的控制器(还是用上面提到的B控制器)引入头文件,之后从声明代理属性开始,之后步骤都一样,就不多说了,直接贴代码
#import "DoSomething.h" // 引头文件
@property (nonatomic, weak) id<DoSomething> doDelegate; // 声明代理属性
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 调用代理方法
if ([self.doDelegate respondsToSelector:@selector(doSomethingWith:)]) {
[self.doDelegate doSomethingWith:@"回调"];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
@interface ViewController () <DoSomething> // 签订代理
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
BViewController *VC = [BViewController new];
VC.doDelegate = self; // 签订代理人
[self presentViewController:VC animated:YES completion:nil];
}
// 实现代理方法
- (void)doSomethingWith:(NSString *)type
{
NSLog(@"%@", type); //
}
代理方法里可以根据不同的type来进行不同的操作,这样多个控制器就可以共用一个代理方法了。
结语:限于水平,本文只写了一些基本用法和注意事项,如果文中存在错误请指出,我会及时修改。
网友评论