iOS 委托代理(delegate)入门

我们可以先看这样一个例子:

 1  1 //
 2  2 //  searchPageController.m
 3  3 //  cardionNet2
 4  4 //
 5  5 //  Created by qiuy on 2017/9/29.
 6  6 //  Copyright © 2017年 qiuy. All rights reserved.
 7  7 //
 8  8 
 9  9 #import "searchPageController.h"
10 10 
11 11 @interface searchPageController ()<ViewForNaviDelegate,NSXMLParserDelegate,ComboxViewControllerDelegate>{
12 12 
13 13 }
14 14 
15 15 
16 16 @end
17 17 
18 18 @implementation searchPageController
19 19 
20 20 - (void)viewDidLoad {
21 21 }
22 22 
23 23 #pragma mark --combox的代理方法
24 24 /**
25 25  * @brief 回掉
26 26  */
27 27 - (void)handleAction:(NSString *)name pramter:(NSNumber *)key indexTag:(NSString *)indexTag {
28 28     //检查类别
29 29     if([indexTag  isEqual: @"STUDY_CLASS_SEQ"]){
30 30         _lblSTUDY_CLASS_SEQ_TEXT.text =name;
31 31         _lblSTUDY_CLASS_SEQ_TEXT.textColor = [UIColor blackColor];
32 32     }else if([indexTag  isEqual: @"SEX_MST"]){//性别
33 33         self.lblSex.text =name;
34 34         _lblSex.textColor = [UIColor blackColor];
35 35     }else if([indexTag  isEqual: @"STUDY_CLASS_MST"]){//申请科室
36 36         self.lblDepartment.text =name;
37 37         _lblDepartment.textColor = [UIColor blackColor];
38 38     }else if([indexTag  isEqual: @"SPATIENT_CLASS_MST"]){ //病人来源
39 39         self.lblPatlent_Class_Mst.text =name;
40 40         _lblPatlent_Class_Mst.textColor = [UIColor blackColor];
41 41     }else if([indexTag  isEqual: @"SCLINICAL_DOCTOR_MST"]){ //诊断医生
42 42         self.lblClincal_Doctor_Mst.text =name;
43 43         _lblClincal_Doctor_Mst.textColor = [UIColor blackColor];
44 44     }
45 45     
46 46 }
47 47 
48 48 @end
searchPageController.m
 1 //
 2 //  ComboxViewController.h
 3 //  cardionNet2
 4 //
 5 //  Created by qiuy on 2017/9/28.
 6 //  Copyright © 2017年 qiuy. All rights reserved.
 7 //
 8 
 9 #import <UIKit/UIKit.h>
10 @protocol ComboxViewControllerDelegate<NSObject>
11 //回调方法
12 - (void)handleAction:(NSString *)name pramter:(NSNumber *)key indexTag:(NSString *)indexTag ;
13 @end
14 @interface ComboxViewController : UIViewController
15 //前页面传过来的数组
16 @property (nonatomic, retain) NSMutableArray *arrForData;
17 //区分
18 @property (nonatomic, retain) NSString *str;
19 //默认值的key
20 @property (nonatomic, retain) NSString *strForValue;
21 @property (nonatomic, retain) NSString *strForTitle;
22 @property (nonatomic, weak) id<ComboxViewControllerDelegate>delegate;
23 @end
ComboxViewController.h
1 - (void)handleConfirm {
2     [self.delegate handleAction:_strForName pramter:_numForKey indexTag: self.strForDif];
3     [self.navigationController popViewControllerAnimated:YES];
4 }
ComboxViewController.M

 一、什么是委托

委托(delegate),就是某个对象指定另一个对象处理某些特定任务的设计模式。通俗来说,就是“某个对象”把要做的事情委托给“另一个对象”去做。

其中“某个对象”被称作委托者,“另一个对象”被称作是被委托者。

二、委托与代理

如下图,委托方通过某种方式把任务分派出去给代理方处理,而两者之间的联系便是协议。

 

在程序中:一般情况下

 

1.委托需要做的工作有:

     1.1定义协议与方法

     1.2声明委托变量

     1.3设置代理

     1.4通过委托变量调用委托方法

 

2.代理需要做的工作有:

     2.1遵循协议

     2.2实现委托方法

 

好了 我们可以看看上面的例子了

1 ComboxViewController.h中 我们做了一个代理方法:handleAction
2 在searchPageController.m中 引用这个代理 @interface searchPageController ()<ViewForNaviDelegate,NSXMLParserDelegate,ComboxViewControllerDelegate>{ }
3 之后就可以 在searchPageController.m中使用这个- (void)handleAction:(NSString *)name pramter:(NSNumber *)key indexTag:(NSString *)indexTag {}
4 ComboxViewController。m 就可以调用searchPageController.m中这个代理了 。

好了 可能我说的不太明确 那来看看其他博主的例子:

可能现在大家还不明白,我们设置如下场景,把每个工作都带入代码就清楚了

场景:Boss准备举行一场party,准备邀请Atany来参加party,但是Boss没空写email给Atany,于是他委托Henry与Mary来做这件事情。

1)   先看YGViewController.h(根控制器,程序第一个界面,类似于Boss)

 1 #import <UIKit/UIKit.h>  
 2 @protocol InviteDelegate  
 3 -(void)inviteToMyParty:(NSString *)personName;//1.1定义协议与方法  
 4 @end  
 5   
 6 @interface YGViewController : UIViewController  
 7 @property (assign,nonatomic) id<InviteDelegate> delegate;//1.2声明委托变量  
 8 - (IBAction)ClickByMary:(id)sender;//委托给Mary  
 9 - (IBAction)ClickByHenry:(id)sender;//委托给Henry  
10 @end  
View Code

在YGViewController.h中,委托执行了两件事情,分别是定义协议与声明委托。Boss并没有实现inviteToMyParty这个方法,他没有自己去邀请。

 

2)   再看YGViewController.m中ClickByMary与ClickByHenry点击事件

 1 - (IBAction)ClickByMary:(id)sender {  
 2     Mary *mary = [[Mary alloc]init];  
 3     self.delegate = mary;//1.3设置代理  
 4     [self.delegate inviteToMyParty:@"atany"];//1.4通过委托变量调用委托方法  
 5 }  
 6 - (IBAction)ClickByHenry:(id)sender {  
 7     Henry *henry = [[Henry alloc]init];  
 8     self.delegate = henry;//1.3设置代理  
 9     [self.delegate inviteToMyParty:@"atany"];//1.4通过委托变量调用委托方法  
10 }  
View Code

两者大同小异,都是实例化对象,然后设置代理,最后调用方法。

BOSS可以选择不同的代理(Henry与Mary)来做这件事情(inviteToMyParty),而自己却不用做。

 

3)   以Henry为例子,我们看看Henry.h

#import <UIKit/UIKit.h>  
#import "YGViewController.h"  
  
@interface Henry : UIViewController <InviteDelegate>//2.1遵循协议  
@end

Henry遵循协议,随时准备好接收Boss的召唤。

 

4)   Henry.m中我们实现了inviteToMyParty的具体方法,我们弹出一个对话框来显示邀请内容。

1 -(void)inviteToMyParty:(NSString *)personName{  
2     NSString *hello = [NSString stringWithFormat:@"Hello,%@",personName];  
3     NSString *str = [NSString stringWithFormat:@"Hey Boy,this is Henry,Come to our party Please!!"];  
4     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:hello message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];  
5     [alert show];  
6 }  
View Code

 

文章引用:http://blog.csdn.net/yang8456211/article/details/11542455




posted @ 2017-10-24 08:53  懒猫口米  阅读(737)  评论(0编辑  收藏  举报