苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

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

查看: 90|回复: 7

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 09:37
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 7 天前 | 显示全部楼层 |阅读模式
    本帖最后由 竹林风 于 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)

  • TA的每日心情
    开心
    昨天 12:22
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    发表于 7 天前 | 显示全部楼层
  • TA的每日心情
    奋斗
    昨天 09:37
  • 签到天数: 21 天

    [LV.4]偶尔看看III

     楼主| 发表于 7 天前 | 显示全部楼层
    在苹果的SDK中UITableView、UIScrollView、UITextField、UITextView等都是使用的这种设计模式。
  • TA的每日心情
    开心
    昨天 09:05
  • 签到天数: 643 天

    [LV.9]以坛为家II

    发表于 7 天前 | 显示全部楼层
  • TA的每日心情
    慵懒
    昨天 08:50
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    发表于 7 天前 | 显示全部楼层
  • TA的每日心情
    奋斗
    昨天 08:44
  • 签到天数: 199 天

    [LV.7]常住居民III

    发表于 7 天前 | 显示全部楼层
  • TA的每日心情
    开心
    昨天 09:03
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 6 天前 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 马上注册

    本版积分规则

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

    GMT+8, 2018-12-13 01:22

    © 2017-2018

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