委托模式:
将所需要实现的具体方法交给某个委托对象,协议类似接口,只定义方法名,没有具体方法实现。因此委托这种设计模式在cocoa框架里面跟协议是有密切关系的。
- 使用委托模式的目的:
为了降低类与类之间代码的耦合度,我们使用协议来帮助实现某个类的功能。常用于类的封装,类与类之间相互调用。 -
具体要求与实现:
1.要求:
在两个互相独立的类中,类A(继承于UIButton)点击btn时,类B必须响应3个打印方法。
2.关键代码的实现:
定义协议P,里面只定义方法名,具体实现看委托对象的具体动作。
—–2.1在委托者A判断委托对象B是否有实现其协议里面的方法,并且判断其动作是否符合规定。
代码为:if([self.delegate respondsToSelector:@selector(printName)]){NSLog(@\"给委托者...\") ;[self.delegate printName] ;}
—–2.2 在委托者A定义一个协议的属性delegate,并设置其委托对象B…
代码为:- (void)viewDidLoad{[super viewDidLoad] ;YANbtn *btn = [[YANbtn alloc]init] ;btn.delegate = self ;[self.view addSubview:btn] ;}
—–2.3在委托对象B中实现相应的协议方法:
代码为 :#pragma btnProtocol-(void)printName{self.label.text = @\"实现委托\" ;[self.label setTextColor:[UIColor redColor]] ;}
三个类的结构图和关系如下:
委托对象B代码:#import \"DesignModeViewController.h\"#import \"YANbtn.h\"@interface DesignModeViewController ()<btnProtocol>@property (weak, nonatomic) IBOutlet UILabel *label;@end@implementation DesignModeViewController- (void)viewDidLoad{[super viewDidLoad] ;YANbtn *btn = [[YANbtn alloc]init] ;btn.delegate = self ;[self.view addSubview:btn] ;}#pragma btnProtocol(void)printName{self.label.text = @\"实现委托\" ;[self.label setTextColor:[UIColor redColor]] ;}@end
委托者A的代码:
#import \"YANbtn.h\"@implementation YANbtn- (id)initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if (self) {self.backgroundColor = [UIColor orangeColor] ;[self setTitle:@\"YANbtn\" forState:UIControlStateNormal ];self.frame = CGRectMake(30, 400, 100, 30) ;[self setFont:[UIFont systemFontOfSize:11]] ;[self addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside] ;}return self;}-(void)btnAction{if([self.delegate respondsToSelector:@selector(printName)]){NSLog(@\"给委托者...\") ;[self.delegate printName] ;}}@end
协议P的代码:
#import <Foundation/Foundation.h>@protocol btnProtocol <NSObject>@optional-(void)printName ;-(void)printAge ;@end
- 点赞
- 收藏
- 分享
- 文章举报
yans67发布了10 篇原创文章 · 获赞 0 · 访问量 5747私信关注