雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

协议 - 按钮与监听器的实现

Posted on 2014-03-15 21:30  huhuuu  阅读(308)  评论(0)    收藏  举报
 

多个按钮可以对应一个监听器,多个监听器也可以对应一个按钮。

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