ios中对protocol协议的个人理解(一,对事件的监听)

         做开始自学ios也有几个月了,虽然一直是自己一个人在摸索着边学边做,但还好公司项目快完成2/3。趁着国庆再回顾了一下oc语言的一些重点,今天就首先记录一下对delegate的理解!

         protocol——委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。我个人的理解是委托主要用于两种方式:一是传值,二是监听事件。今天就先说监听事件吧。

        通常我们要使用委托机制,一般需要通过以下这五个步骤:

         1.创建一个delegate;

         2.委托者声明一个delegate;

         3.委托者调用delegate里的方法;

         4.被委托者实现delegate里的方法;

         5.  被委托者设置delegate,以便被委托者使用;            

        

         下面是一个通过protocol模拟UIButton的demo:

           1.首先创建一个delegate 。我们可以在某一个类的.h文件中创建,也可以单独建立一个文件来创建protocol,这里使用前者,如下为Button.h文件:

                   #import <Foundation/Foundation.h>
                   @class Button;

                  // 创建一个ButtonDelegate ,一般delegate都要实现协议NSObject
                    @protocol ButtonDelegate <NSObject>
                             - (void)onClick:(Button *)btn;
                   @end


                 @interface Button : NSObject

                 // 委托者声明了一个delegate,delegate就是按钮的监听器
                   @property (nonatomic, retain) id<ButtonDelegate> delegate;


                   // 点击按钮
                             - (void)click;
                @end


             2.委托者声明一个delegate,我们这里的委托者为Button这个类所产生的对象。这一步我已经在Button.h文件中实现,即其中的红色字体部分。


            3.委托者调用delegate里的方法,如下的Button.m文件中 的click方法的实现:
                       #import "Button.h"
                      @implementation Button

                     - (void)dealloc {
                                 [_delegate release];
                                [super dealloc];
                       }

                   - (void)click {
                             // 如果_delegate实现了onClick:这个方法
                            if ( [_delegate respondsToSelector:@selector(onClick:)] ) {
                                        // 按钮被点击了,就应该通知监听器.并且告诉监听器哪个按钮被点击了
                                        [_delegate onClick:self];//这里即是实现了委托者调用delegate里的方法
                           } else {
                                      NSLog(@"监听器并没有实现onClick:方法");
                         }
                 }
               @end

           4.这里通过创建一个ButtonListener类来作为被委托者,并且完成被委托者实现delegate里的方法这一步,在ButtonListener.m文件中实现:

          ButtonListener.h文件为:
                       #import <Foundation/Foundation.h>

                   // 对协议进行提前声明,跟@class的用途是一致的
                    @protocol ButtonDelegate;

                    @interface ButtonListener : NSObject <ButtonDelegate>

                    @end



          ButtonListener.m文件为:

                   #import "ButtonListener.h"
                    #import "Button.h"

                  @implementation ButtonListener

                  - (void)onClick {//实现delegate里的方法
                            NSLog(@"ButtonListener已经监听到按钮被点击了");
                    }
                @end


            5.被委托者设置代理delegate,以便被 (注意与前一个被委托者不同)委托者调用。这一步在main.m中实现,main.m文件为:


                #import <Foundation/Foundation.h>
                #import "Button.h"
                #import "ButtonListener.h"
                #import "MyListener.h"

               int main(int argc, const char * argv[])
               {

                  @autoreleasepool {
                     // 初始化一个按钮
                     Button *button = [[[Button alloc] init] autorelease];
        
                      // 初始化一个按钮的监听器
                   ButtonListener *listener = [[[ButtonListener alloc] init] autorelease];
                    // 设置按钮的监听器,亦即被委托者设置delegate,以便被委托者使用
                   button.delegate = listener;
                   NSLog(@"button:%@", button);
                   // 点击按钮
                  [button click];
              }
               return 0;
           }

        通过以上步骤,我们即模拟完成了事件的监听。(以上代码出自李明杰老师的教程,这里借用了,感谢他,勿喷!)

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值