多个按钮可以对应一个监听器,多个监听器也可以对应一个按钮。
protocol类似与java中的接口,类似于C++中的虚基类,只是定义了方法,却没有具体的实现。
主函数中的调用按钮:
#import <Foundation/Foundation.h> #import "Button.h" #import "ButtonListenner.h" int main(int argc, const char * argv[]) { @autoreleasepool { //初始化一个按钮 Button *button = [[[Button alloc]init]autorelease]; //初始化一个监听器 ButtonListenner *listenner = [[[ButtonListenner alloc] init]autorelease]; // MyListener *listenner = [[[MyListener alloc]init]autorelease]; //设置按钮的监听器 button.delegate = listenner; [button click]; } return 0; }
按钮的声明:
#import <Foundation/Foundation.h> //<>代表实现某个协议 @class Button; @protocol ButtonDelegate <NSObject> -(void) onClick:(Button *)But; @end @interface Button : NSObject @property (nonatomic,retain) id <ButtonDelegate> delegate; //点击按钮 -(void) click; @end
按钮的实现:
#import "Button.h" @implementation Button -(void)dealloc{ [_delegate release]; [super dealloc]; } -(void)click{ NSLog(@"点击 click"); //按钮被点击就应该通知监听器 if([_delegate respondsToSelector:@selector(onClick:)]) //检查onClick:方法是否存在 [_delegate onClick:self]; //通知监听器的唯一方法就是调用监听器的方法 } @end
监听器的声明:
#import <Foundation/Foundation.h> @protocol ButtonDelegate; @interface ButtonListenner : NSObject<ButtonDelegate> @end
监听器的实现:
#import "ButtonListenner.h" #import "Button.h" @implementation ButtonListenner -(void)onClick{ NSLog(@"ButtonListenner 已近监听到按钮被点击了!"); } -(void)onClick:(Button *)But{ NSLog(@"ButtonListenner = %@ 已近监听到按钮被点击了!",self); } @end
浙公网安备 33010602011771号