苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper万能框架(V2.3) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V1.9) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 187|回复: 7

[基础] Object-C设计模式委托(Delegate)

[复制链接]
发表于 2018-12-6 17:34:04 | 显示全部楼层 |阅读模式
本帖最后由 竹林风 于 2018-12-6 17:33 编辑

什么是委托


首先让我们来看看委托的定义:委托delegate),就是某个对象指定另一个对象处理某些特定任务的设计模式。通俗来说,就是“某个对象”把要做的事情委托给“另一个对象”去做。其中“某个对象”被称作委托者,“另一个对象”被称作是被委托者。


【注】:委托者与被委托者的叫法很多,例如(普通对象与委托对象,委托与代理等等)为了方便大家理解,下文统一使用“委托与代理”的叫法。


在委托与代理之间还有一个重要的概念——协议,协议是委托与代理之间的桥梁,把两者紧密联系在一起。

委托与代理

在程序中:一般情况下


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


  •      1.定义协议与方法
  •      2.声明委托变量
  •      3.设置代理
  •      4.通过委托变量调用委托方法


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


  •      1遵循协议
  •      2实现委托方法


可能现在看起来还是不是很明白,我们可以设置如下场景,把工作都带入到代码中就很容易理解了。


场景:Leader创建了一个论坛,准备邀请fan注册为会员,但是Leader没空写email给fan,于是他委托amy来做这个事情。

1.先看firstVC.h(程序的第一个页面,相当于Leader)

[Objective-C] 纯文本查看 复制代码
#import <UIKit/UIKit.h>

@protocol InviteDelegate

-(void)inviteToRegistMyForum:(NSString *)personName; //定义协议与方法

@end
@interface firstVC : UIViewController

@property (nonatomic, assign) id<InviteDelegate> delegate;//声明委托变量

-(void)clickByAmy:(UIButton *)sender; //委托给Amy

@end

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

再看firstVC.m中clickByAmy点击事件:

[Objective-C] 纯文本查看 复制代码
-(void)clickByAmy:(UIButton *)sender{
    AmyVC * amy = [[AmyVC alloc]init];
    amy.title = @"我是Amy";
    self.delegate = amy;//设置代理
    [self.delegate inviteToRegistMyForum:@"fan"];
    [self.navigationController pushViewController:amy animated:YES];
}

Leader选择Amy来做这件事情(inviteToRegistMyForum),而自己却不用做。

接下来我们看看AmyVC.h

[Objective-C] 纯文本查看 复制代码
#import <UIKit/UIKit.h>
#import "firstVC.h"

@interface AmyVC : UIViewController<InviteDelegate>

@end

AmyVC遵循协议,随时准备好接收Leader的召唤.

AmyVC.m中我们实现了inviteToRegistMyForum的具体方法,我用了一个label来显示邀请内容。

这样我们就完成了一个简单的协议+委托的程序

执行效果:

Untitled.gif


附件: Test-Delegate.zip (157.39 KB, 下载次数: 0)

发表于 2018-12-6 17:36:25 | 显示全部楼层
 楼主| 发表于 2018-12-6 17:36:36 | 显示全部楼层
在苹果的SDK中UITableView、UIScrollView、UITextField、UITextView等都是使用的这种设计模式。
发表于 2018-12-6 17:37:57 | 显示全部楼层
发表于 2018-12-6 17:40:16 | 显示全部楼层
发表于 2018-12-6 17:45:31 | 显示全部楼层
发表于 2018-12-7 17:22:56 | 显示全部楼层
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1 )

GMT+8, 2019-2-19 05:18

© 2017-2018

快速回复 返回顶部 返回列表