代理是iOS开发中常用的设计模式。我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式。

什么是代理?

苹果的官方文档给了很清晰的解释:

Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

意译一下就是:代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象和程序中其他的对象进行交互。 主对象(这里指的是delegating object)中维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息。这个消息通知“代理”主对象即将处理或是已经处理完了某一个事件。这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它即将发生的事件该如何来处理。代理的主要价值是它可以让你容易的定制各种对象的行为。注意这里的代理是个名词,它本身是一个对象,这个对象是专门代表被代理对象来和程序中其他对象打交道的。

Cocoa中的代理

Cocoa Touch框架里大量使用了代理这种设计模式,在每个UI控件类里面都声明了一个类型为id的delegate或是dataSource,查看Cocoa的头文件可以发现很多如下的属性:

@property(nonatomic, assign)id<UIActionSheetDelegate> delegate;   // weak reference

通常格式为@property(nonatomic, assign)id<protocol_name> delegate;  即这个代理要遵循某一个协议,也就是说只有遵循了这个协议的类对象才具备代理资格。这同时也要求了代理类必须在头文件中声明遵循这个protocol_name协议并实现其中的@required方法,@optional的方法是可选的。

以UIActionSheet为例,我们定义一个View,当点击这个View中的某一个按钮时触发UIActionSheet, 当用户对UIActionSheet完成了某一项操作,比如Destruct按钮被按下,或是cancel按钮被按下,UIActionSheet会发送消息给delegate,由delegate完成对用户操作的响应,比如打印一个字符串到屏幕上。图示说明如下:

首先,我们创建一个基于tab的工程,在FirstViewController.h中添加代码,使这个类遵循UIActionSheetDelegate协议:

1 @interface FirstViewController : UIViewController <UIActionSheetDelegate> 

在View中添加一个按钮用于触发这个ActionSheet,然后编写这个按钮的响应代码:

 1 - (IBAction)invokeActionSheet:(id)sender {
 2
 3     UIActionSheet *actionSheet = [[UIActionSheet alloc]
 4                                   initWithTitle:@"Delegate Example"
 5                                   delegate:self // telling this class(ViewController) to implement UIActionSheetDelegate
 6                                   cancelButtonTitle:@"Cancel"
 7                                   destructiveButtonTitle:@"Destruct"
 8                                   otherButtonTitles:@"Button 1",@"Button 2",nil];
 9
10     [actionSheet showInView:self.tabBarController.view];
11     [actionSheet release];
12 }  

注意,上面有一个很重要的设置就是参数中有个delegate:self,这个设置就是指明了UIActionSheet的代理为self, 也即FirstViewController。

然后在FirstViewController.m中实现UIActionSheetDelegate中的方法:

 1 #pragma mark --UIActionSheet delegate methods
 2 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
 3     switch (buttonIndex) {
 4         case 0:
 5             self.myTextFromActionSheet.text = @"Action Destructed!";
 6             break;
 7         case 1:
 8             self.myTextFromActionSheet.text = @"Action Button 1 Clicked!";
 9             break;
10         case 2:
11             self.myTextFromActionSheet.text = @"Action Button 2 Clicked!";
12             break;
13         case 3:
14             self.myTextFromActionSheet.text = @"Cancel Button Clicked!";
15             break;
16         default:
17             break;
18     }
19
20 }  

上面的几步我们完成了对Cocoa中UIActionSheet已有代理的运用。然而我们很多时候需要自己编写定制的代理,该如何实现呢?

自定义代理

我们要做的是,创建一个view,自定义一个代理实现更新这个view中的字符串。上面我们已经创建好了一个tab工程,借用里面的second view。我们拖一个按钮到上面命名为ChangeText,响应函数为- (IBAction)changeText:(id)sender;点击这个按钮进入一个modal view 名为ChangeTextView,我们在ChangeTextView中输入一个字符串并在退出这个view后把这个字符串更新到second view上面。如何实现modal view和second view之间的数据传递呢?那就是代理!谁的代理?ChangeTextView的代理!因为我们直接在ChangeTextView中输入数据,需要由代理把输入的字符串反馈到second view上面去。

1、创建一个新的类ChangeTextViewController,并创建相应的xib文件。

2、在ChangeTextViewController.h中声明一个协议ChangeTextViewDelegate:

1 @protocol ChangeTextViewDelegate <NSObject>
2
3 - (void) textEntered:(NSString*) text;
4
5 @end  

和UIActionSheet类似,在ChangeTextViewController中我们也需要添加一个代理的声明:

1 @property (assign, nonatomic) id<ChangeTextViewDelegate> delegate; 

3、我们还需要在ChangeTextViewController.xib中添加一个按钮save,当按下这个按钮会返回到second view中,并更新字符串。对save按钮的响应函数为:

 1 - (IBAction)saveButtonClicked:(id)sender {
 2     //Is anyone listening
 3     if([delegate respondsToSelector:@selector(textEntered:)])
 4     {
 5         //send the delegate function with the amount entered by the user
 6         [delegate textEntered:textEntered.text];
 7     }
 8
 9     [self dismissModalViewControllerAnimated:YES];
10 }  

[delegate textEntered:textEntered.text];这句代码的含义就是ChangeTextViewController通知代理,textEntered这个事件发生了,对textEntered这个消息的实现,即如何响应这个textEntered的事件由代理来实现。在本例中,SecondViewController就是ChangeTextViewController对象的代理。所以,我们要对SecondViewController做相应的设置使其满足代理的条件。首先,在SecondViewController.h中声明遵循协议ChangeTextViewDelegate。然后编辑ChangeText按钮的响应函数- (IBAction)changeText:(id)sender;

1 - (IBAction)changeText:(id)sender {
2     ChangeTextViewController *CTViewController = [[ChangeTextViewController alloc] initWithNibName:@"ChangeTextViewController" bundle:nil];
3     //Assign this class to the delegate of ChangeTextViewController,
4     //remember to make thie ViewController confirm to protocol "ChangeTextViewDelegate"
5     //which is delared in file ChangeTextViewController.h
6     CTViewController.delegate = self;
7     [self presentModalViewController:CTViewController animated:YES];
8 }  

注意,CTViewController.delegate = self;这句实现了SecondViewController成为ChangeTextViewController对象的代理。

【转自:http://blog.csdn.net/lovefqing/article/details/8270111】

转载于:https://www.cnblogs.com/cuinidaye/p/4036441.html

【iOS开发】代理(delegate)相关推荐

  1. IOS之代理的使用(重点)

    IOS之代理的使用(重点) IOS的代理(Delegate) 是学习的重难点,必须学会,必须滚瓜烂熟 1.点击自定义视图的时候,创建了一个Label,Label添加到了superView,不合理的地方 ...

  2. iOS开发之通过代理逆向传值

    在iOS开发中,传值是几乎每个App都会用到的,对于传统的顺向传值应该说是比较简单的,但是逆向传值往往会用到代理模式来实现,很多同学在这一块有迷惑,迷惑的不是怎么逆向传值,而是不理解代理模式,下面就来 ...

  3. iOS开发系列--让你的应用“动”起来

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  4. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

  5. iOS开发系列--UITableView全面解析

    iOS开发系列--UITableView全面解析 2014-08-23 23:20 by KenshinCui, 2202 阅读, 18 评论, 收藏,  编辑 --UIKit之UITableView ...

  6. iOS开发-面试总结(九)

    iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...

  7. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  8. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

    在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...

  9. iOS开发之让你的应用“动”起来转写

    在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...

最新文章

  1. 一堂拯救万千股民的公开课
  2. MySQL同步复制搭建方法指南详细步骤
  3. 通过句柄找到广告弹窗进程
  4. latex插入表格_如何将word表格变成LaTeX代码?
  5. 【收藏】在QGIS中导入GOOGLE、BING等地图和卫星影像(插件方式和XYZ方式)
  6. TypeError: 'NoneType' object is not subscriptable
  7. scala特性_Scala | 特性应用
  8. 2寸的照片长宽各是多少_贵州公务员考试照片尺寸要求是多少
  9. winform文件迁移工具
  10. 04:输出保留3位小数的浮点数
  11. 不能错过的linux驱动开发的经典书籍推荐
  12. 【wav音频解析】之wavread函数的C++实现
  13. AR-VR视觉辐辏调节冲突已被RealView解决
  14. Oracle 备份失败报错ORA-04063: view SYS.KU_RADM_FPTM_VIEW has errors
  15. 国开计算机专业英语答案,2021国开河北《计算机专业英语阅读》形考任务1-4题库.docx...
  16. International English Language Testing System - IELTS - 雅思
  17. 2020京东全球科技探索者大会来啦!三大体系CEO约你来开会!
  18. hiho第三周 KMP
  19. postgresql 开启大页_Postgresql-11.X 性能优化详解
  20. 听说你还搞不懂Golang的Slice?看这一篇就够了!

热门文章

  1. python 获取当天凌晨零点的时间戳
  2. Python中的分组函数(groupby、itertools)
  3. 关于window.showModalDialog()返回值的学习
  4. java 用户、角色、权限数据库设计
  5. angular cannot get /
  6. python 第3天
  7. 《电子基础与维修工具核心教程》——第2章 电阻2.1 电阻器介绍
  8. 《剑指offer》-统计整数二进制表示中1的个数
  9. VHD容量调整的方法(保存原有vhd)
  10. error: '[class name]' does not name a type