OC协议案例:监听器实现

     这里需要首先理解监听模式(观察者模式)和委托模式的区别,个人觉得两种模式绝大部分理念或者实现机制相同,所以这里暂且不做区分,只是OC里偏重与委托这个词,而Java中更习惯监听。

  实验内容:多个 Button 共用一个监听器对象
 1
、创建协议 ButtonDelegate ,注意 onClick 方法的参数是一个 Button 对象,也就是事件源对象
 
 @class Button;
 @protocol ButtonDelegate <NSObject>
 -(void)onClick:(Button *) btn;
 @end
 
 2
、创建 Button 类,
 
添加两个属性 _ID _delegate 及其 getter setter
 
添加构造方法 initWithID:(int)newID
 
添加方法 Button 点击触发方法 click
 
 
 3
、创建 Button 的监听器类, MyButtonDelegate ,实现协议 ButtonDelegate ,覆盖 onClick :方法
 
注意此时 “onClick:” 为空方法
 
 4
、在 main 中添加测试代码
 a
、创建四个 Button 对象, btn1 btn2 btn3 btn4 并且分别设置其 “_ID” 属性为 1 2 3 4
 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;

@end
Button.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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值