OC协议案例:监听器实现

来源:互联网 发布:lte ping时延优化 编辑:程序博客网 时间:2024/06/05 11:18
     这里需要首先理解监听模式(观察者模式)和委托模式的区别,个人觉得两种模式绝大部分理念或者实现机制相同,所以这里暂且不做区分,只是OC里偏重与委托这个词,而Java中更习惯监听。

 实验内容:多个Button共用一个监听器对象
 1
、创建协议ButtonDelegate,注意onClick方法的参数是一个Button对象,也就是事件源对象
 
 @class Button;
 @protocol ButtonDelegate <NSObject>
 -(void)onClick:(Button *) btn;
 @end
 
 2
、创建Button类,
 
添加两个属性_ID_delegate及其gettersetter
 
添加构造方法initWithID:(int)newID
 
添加方法Button点击触发方法click
 
 
 3
、创建Button的监听器类,MyButtonDelegate,实现协议ButtonDelegate,覆盖onClick:方法
 
注意此时“onClick:”为空方法
 
 4
、在main中添加测试代码
 a
、创建四个Button对象,btn1btn2btn3btn4并且分别设置其“_ID”属性为1234
 b
、创建监听器对象,并且将其依次设置给四个Button对象
 c
、修改监听器类方法onClick
 
利用switch辨别事件源,并且执行不同的操作
 
 switch(btn.ID){
    case 1:
        break;
    case 2:
        break;
    case 3:
        break;
    default:
        break;
 }

代码如下:
ButtonDelegate.h: 协议类(其实就是Java中的监听器接口)
#import <Foundation/Foundation.h>
@class
 MyButton;

//一般定义协议最好实现NSObject协议
//Cocoa有多个根类,除了NSObject还有NSProxy等其他等级的根类。这只是部分原因,NSObject协议定义了一套所有的根类都可以实现的基础方法,这样在编码时就容易找到了。
@protocol ButtonDelegate <NSObject]] > 

-(
void)onClick:(MyButton *) btn;

@end

Button类:
Button.h
#import <Foundation/Foundation.h>

//这里和@class类似,只需要声明ButtonDelegate是一个协议即可,无需关心其成员等细节
@protocol ButtonDelegate;

//定义了一个按钮类,里面要有一个委托对象成员,也就是实现了委托协议的对象成员
@interface MyButton : NSObject

//声明原子操作,且使用计数器处理内存
@property(nonatomic,retain) id<ButtonDelegate> delegate;
@property int ID;//注意要大写

-(
id)initWithID:(int)ID;

-(
void)click;

@endButton.m

#import "MyButton.h"
#import
 "ButtonDelegate.h"

@implementation MyButton

-(
id)initWithID:(int)ID{
   
 if (self = [super init]) {
       
 _ID = ID;
    }
   
 return self;
}

-(
void)click{
   
 // 调用前使用selector检查是否存在这个方法
   
 if ([_delegate respondsToSelector:@selector(onClick:)]) {
        [
_delegate onClick:self];
    }
else{
       
 NSLog(@"没有这个方法!!");
    }
}

@end
MyButtonDelegate:委托实现类(其实就是监听器实现类)
MyButtonDelegate.h

#import <Foundation/Foundation.h>
#import
 "ButtonDelegate.h" //
//@protocol ButtonDelegate;  //这里不能用@protocol声明

//委托对象实现类,实现了委托协议ButtonDelegate,并且覆盖onClick:方法
@interface MyButtonDelegate : NSObject <ButtonDelegate]] > 

@end
MyButtonDelegate.m

#import "MyButtonDelegate.h"
#import 
"MyButton.h"

@implementation MyButtonDelegate

//覆盖实现协议中的方法,为按钮被点击时实际被调用的方法
-(
void)onClick:(MyButton *)btn{
    
switch ([btn ID]) {
        
case 0:
            
NSLog(@"ID1的那个按钮被点击了!");
            
break;
        
case 1:
            
NSLog(@"ID2的那个按钮被点击了");
            
break;
        
case 2:
            
NSLog(@"ID3的那个按钮被点击了");
            
break;
        
default:
            
break;
    }
}


main.m: 测试代码

#import <Foundation/Foundation.h>
#import
 "MyButton.h"
#import
 "MyButtonDelegate.h"

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

   
 @autoreleasepool {
       
 MyButton *btn0 = [[MyButton alloc]initWithID:0];
       
 MyButton *btn1 = [[MyButton alloc]initWithID:1];
       
 MyButton *btn2 = [[MyButton alloc]initWithID:2];
       
       
 MyButtonDelegate *delegate = [[MyButtonDelegate alloc]init];
       
        btn0.
delegate = delegate;
        btn1.
delegate = delegate;
        btn2.
delegate = delegate;
       
        [btn0
 click];
        [btn1
 click];
        [btn2
 click];
       
    }
   
 return 0;
}


0 0
原创粉丝点击