委托delegation是一种简单但是功能强大的设计模式,它的功能是程序中一个对象代表另一个对象,或者一个对象与另外一个对象协同工作。委托对象保留了另外一个对象的引用,即就是委托,以及在合适的时候发送消息给委托。消息通知事件的委托方法,委托对象将要处理或已经处理。委托可能通过更新本身或者本应用的其他对象的状态或者外观来对消息进行响应,在某些情况下委托也可能返回值,从而影响即将发生事件的处理方式。委托模式的主要价值是让你通过一个中心对象,简单的自定义某些对象的行为。下图为官方文档的解释:
在iOS开发中,要搞清楚Delegate或者学会使用Delegate是需要一个过程的。我在学习iOS过程中,最开始对Delegate很不解,随着项目经验的增长,慢慢对Delegate有了比较清楚的理解。Delegate本来是软件架构设计的一种理念。它是为了使视图之间的逻辑关系更加清晰,视图之间的关系,不仅仅是跳转,更重要的是视图之间数据传递。
一般在什么情况下,需要使用Delegate。当视图A发生变化时,需要将这个变化告知视图B,让视图B做出相应的反应时,一般这个时候我们就需要使用Delegate。下面举例说明:
这是一个toolbar控件(如上图红色区域所示),toolbar控件包含拍照、相册、@、#、表情键盘与系统自带键盘切换等功能。当我们选中拍照、相册、@、#、表情键盘与系统自带键盘切换(WBComposeToolBar视图)按钮时,视图控制器(WBComposeViewController)需要根据按下的按钮来调用不同的功能。这时需要解决的问题是当点击WBComposeToolBar视图的按钮进行切换里,让Delegate告知WBComposeViewController视图。
通常一个delegate的使用过程,需要5步:
1.创建一个delegate;
2.委托者声明一个delegate;
3.委托者调用delegate内的方法(method);
4.被委托者设置delegate,以便被委托者调用;
5.被委托者实现Delegate所定义的方法。
接下来,我们结合项目的代码对Delegate的使用过程进行详细说明:
1.1 第一步:创建一个deleagte,在WBComposeToolBar.h文件中,通过@protocol创建一个delegate,并声明可选一个委托方法
@protocol WBComposeToolBarDelegate <NSObject> @optional -(void)composeWithBar:(WBComposeToolBar *)toolbar didClickbtn:(HWComposeToolbarButtonType)type; @end@optional表明,这个方法是可以不实现的,是可选的。
1.2第二步:委托者声明一个delegate
@property (nonatomic,weak) id<WBComposeToolBarDelegate> delegate;1.3第三步:委托者调用delegate的方法
-(void)btnclick:(UIButton *)btn { if ([self.delegate respondsToSelector:@selector(composeWithBar:didClickbtn:)]) { [self.delegate composeWithBar:self didClickbtn:btn.tag]; } }1.4第四步:被委托者设置delegate
self.toolBar.delegate = self;1.5第五步:被委托者实现delegate所定义的方法。
-(void)composeWithBar:(WBComposeToolBar *)toolbar didClickbtn:(HWComposeToolbarButtonType)type { switch (type) { case HWComposeToolbarButtonTypeCamera:// 拍照 [self openCamera]; break; case HWComposeToolbarButtonTypePicture://相册 [self openAlbum]; break; case HWComposeToolbarButtonTypeMention://@ break; case HWComposeToolbarButtonTypeTrend: //# break; case HWComposeToolbarButtonTypeEmotion: //表情、键盘 [self switchKeyboard]; break; } }通过上面的五步,我们能清楚的看到Delegate是用来实现不同视图之间的数据交互。
源代码下载地址:http://download.csdn.net/detail/jasonjwl/9243939