• iOS代理模式设置方法


    代理模式通常用于解决类似这样的问题:我们通过界面A打开了界面B,但在应用进行的过程中,界面B有时候也需要和A主动联络,比如点击某个按钮时。一个比较好的办法是,让A成为B的代理,这样B就可以在需要的时候给A发送消息了。

    代理模式的一个好处是,B实际上不需要了解A的任何事情,只要知道A是自己的代理就可以了。在这种模式下,B依然独立与A,实现了松耦合。

    对象A是对象B的代理,对象B需要向A发送消息,设置方法分四步:

    1、在对象B的.h中定义一个protocol代理协议,并声明一个协议的属性变量

    2、让对象B在适当的时候向代理对象A发送消息,比如触发按钮时。

    3、让对象A遵从代理协议

    4、通知对象B,现在A是它的代理

    分步说明:

    1、在B.h中定义代理协议和属性变量

     1  /*****B.h*****/
     2  
     3 @protocol BDelegate<NSObject>
     4  
     5 - (void) degegateMethod:(instanceType)instance;
     6  
     7 @end
     8  
     9 @interface B
    10  
    11 @property(weak,nonatomic) id<BDelegate> delegate;
    12  
    13 @end

    2、在B.m中实现B向A发送消息的方法,以按下done按钮为例:

     1 /*****B.m******/
     2  
     3 #import "B.h"
     4  
     5 @interface B()
     6   
     7 @end
     8  
     9 @implementation B
    10 
    11 - (IBAction)done:(id)sender{
    12 [self.delegate delegateMethod:instance];
    13 }
    14 
    15 @end

    3、让A遵从代理协议,在A.h的@interface声明中增添一个尖括号即可

    1 /*****A.h*****/
    2 
    3 @interface A<BDelegate>
    4 
    5 @end

    4、通知对象B,A已经成为它的代理。在A.m中实现代理方法即可

     1 /*****A.m*****/
     2 
     3 #import "A.h"
     4 
     5 @interface A()
     6  
     7 @end
     8 
     9 @implementation A
    10 
    11 - (void)delegateIdentifierMethod:(B *)b{
    12 //do something;
    13 B.delegate=self;      //identify the delegate of B is A
    14 }
    15  
    16 - (void)delegateMethod:(instanceType)instance{
    17 //do something
    18 }
    19  
    20 @end

    需要注意的是,在B.h中声明的代理方法delegateMethod需要在A.m中实现,否则会报错。

  • 相关阅读:
    [Web]flask-excel实现excel文件下载的前后端实现
    [python]UnicodeEncodeError: 'gbk' codec can't encode character 'ufffd'
    [vscode] pylint在虚拟环境下错误告警问题
    [转]jQuery 选择器和dom操作
    用户认证过程及用户认证相关问题整理
    [mariadb]Windows Mariadb 10.2安装过程
    [Python]Flask 源代码分析-config
    【Weiss】【第03章】练习3.9:大整数运算包
    【Weiss】【第03章】练习3.8:有序多项式求幂
    【Weiss】【第03章】链表例程的一些修改
  • 原文地址:https://www.cnblogs.com/yapollo/p/5021174.html
Copyright © 2020-2023  润新知