iOS开发技术分享】协议与代理
一、理解协议与代理
协议:
协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。
代理:
代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。
二、协议的使用
在定义协议时,可以通过@required与@optional来配置遵守这个协议必须去实现的方法和可以选择的方法。譬如:
@protocol MyChooseDayViewDelegate
@required
- returnChooseDay:(id)myChooseDayView;
@optional
- hideThisView;
- changeDateFormatter:(NSString*)formatString;
@end
在定义的协议 MyChooseDayViewDelegate中,如果遵守该协议,就必须实现协议中的- returnChooseDay: 方法,同时可以根据实际程序要求去实现- hideThisView 与 - changeDateFormatter: 。
同时,协议支持对本身的一种扩展,譬如:
@protocol MyChooseTimeViewDelegate< MyChooseDayViewDelegate>
- doSomething;
@end
MyChooseTimeViewDelegate扩展了MyChooseDayViewDelegate这个协议,也就是说,假如遵守了MyChooseTimeViewDelegate的话,也必须实现MyChooseDayViewDelegate中的方法(@required)使用分类的话,就是在定义类的头文件中使用<> 将所需要的协议引入,如果引入多个协议,用”,”分隔,譬如:
@interface MyClassView:UIViewController
import
import
import “MyInformationView.h”
@interface MyInformationView()
@end
@implementation MyInformationView
@synthesize myDelegate = _myDelegate;
//Todo: 处理一些初始化方法和其他一些事件
// changeMyInformationData 是操作此view可能产生的数据变动。它可能是选择器变动、点击按钮等等,但我们并不想在此view处理它,因为它的变动可能对调用此view的controller造成影响,所以…
- (void) changeMyInformationData:(id)sender
{
//TODO:数据变动….
if ([self.myDelegate respondsToSelector:@selector(returnValueToShow:)]) {
[self.myDelegate returnValueToShow:self];
}
}
@end
3.ViewController
这里就不写代码了,在头文件中声明此类遵守MyInformationViewDelegate协议。在实现文件(.m)中,调用MyinfomationView的时候,设置代理成自己,
MyInformation *myInfoView = [[MyInformation alloc] init…….];
myInfoView.myDelegate = self;
然后实现协议中要求实现的方法
- (void)returnValueToShow:(MyInformationView*)myInfoView
{
//TODO:做想做的事情
}