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
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
1 - (void)handleConfirm { 2 [self.delegate handleAction:_strForName pramter:_numForKey indexTag: self.strForDif]; 3 [self.navigationController popViewControllerAnimated:YES]; 4 }
一、什么是委托
委托(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
在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 }
两者大同小异,都是实例化对象,然后设置代理,最后调用方法。
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 }
文章引用:http://blog.csdn.net/yang8456211/article/details/11542455