OC协议案例:监听器实现
来源:互联网 发布:lte ping时延优化 编辑:程序博客网 时间:2024/06/05 11:18
这里需要首先理解监听模式(观察者模式)和委托模式的区别,个人觉得两种模式绝大部分理念或者实现机制相同,所以这里暂且不做区分,只是OC里偏重与委托这个词,而Java中更习惯监听。
#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
#import <Foundation/Foundation.h>
#import "ButtonDelegate.h" //
//@protocol ButtonDelegate; //这里不能用@protocol声明
//委托对象实现类,实现了委托协议ButtonDelegate,并且覆盖onClick:方法
@interface MyButtonDelegate : NSObject <ButtonDelegate]] >
@end
#import "MyButtonDelegate.h"
#import "MyButton.h"
@implementation MyButtonDelegate
//覆盖实现协议中的方法,为按钮被点击时实际被调用的方法
-(void)onClick:(MyButton *)btn{
switch ([btn ID]) {
case 0:
NSLog(@"ID为1的那个按钮被点击了!");
break;
case 1:
NSLog(@"ID为2的那个按钮被点击了");
break;
case 2:
NSLog(@"ID为3的那个按钮被点击了");
break;
default:
break;
}
}
#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;
}
实验内容:多个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;
}
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
@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
//这里和@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(@"ID为1的那个按钮被点击了!");
break;
case 1:
NSLog(@"ID为2的那个按钮被点击了");
break;
case 2:
NSLog(@"ID为3的那个按钮被点击了");
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
- OC协议案例:监听器实现
- OC协议可选实现
- c++抽象类实现OC中的协议
- OC中通过协议实现多继承
- OC中的以协议实现的委托
- 监听器综合案例
- Servlet监听器案例
- TCP协议实现数据传输的简单案例
- OC协议
- oc 协议
- oc 协议
- OC协议
- OC 协议
- oc ------协议
- oc协议
- OC-协议
- OC协议
- OC-协议
- xmpp协议的实现
- 自我控制
- linux sort 命令详解
- jfreechart柱图总结
- linux sort,uniq,cut,wc命令详解
- OC协议案例:监听器实现
- web sso 单点登录简单实例源码
- Cocostudio 1.4 实现的DemoShop
- java程序中,如何安全的结束一个正在运行的线程?
- 沁园春·雪作者:毛泽东Author: MAO zedong
- List<T>去除重复对象
- java生成二维码
- IEC61850变电站基本通信结构-原理和模型_5ACSI通信
- UIColor使用十六进制的宏