您的位置:首页 > 移动开发 > IOS开发

ios协议 与代理

2015-11-10 19:02 363 查看
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:做想做的事情

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: