Protocol - 2

学习例子来自: http://www.cnblogs.com/kenshincui/p/3869639.html#protocol

代码结构如下,并且在main.m主程序中测试


代码实现分别如下:

LBButonDelegate协议 和 LBButon声明

#import <Foundation/Foundation.h>

@class LBButton;

@protocol LBButtonDelegate <NSObject>

@required
- (void)onClick:(LBButton*)button;

@optional
- (void)onMouseover:(LBButton*)button;
- (void)onMouseout:(LBButton* )button;

@end


@interface LBButton : NSObject

#pragma mark - 代理属性,同时约定为代理的对象必须实现的协议
@property (nonatomic, strong) id<LBButtonDelegate> delegate;

- (void)click;

@end

实现

#import "LBButton.h"

@implementation LBButton

- (void)click
{
    NSLog(@"Invoke LBButton's click method.");
    NSLog(@"check Button %@", self);
    
    if ([_delegate respondsToSelector:@selector(onClick:)])
    {
        [_delegate onClick:self];
    }
}

@end


LBListener声明:

#import <Foundation/Foundation.h>
@class LBButton;
@protocol LBButtonDelegate;

@interface LBListener : NSObject <LBButtonDelegate>

- (void)onClick:(LBButton*)button;

@end

LBListener实现:

#import "LBButton.h"
#import "LBListener.h"

@implementation LBListener

- (void)onClick:(LBButton *)button
{
    NSLog(@"Invoke MyListener's onClick method.The button is:%@", button);
}

@end


main.m文件:

        /** Protocol Practise **/
        
        LBButton* button = [[LBButton alloc] init];
        LBListener* listener = [[LBListener alloc] init];
        button.delegate = listener;
        [button click];


程序运行并放置断点如下:





输出如下:



大牛的文章将这些实现称为模拟按钮的点击事件,仔细想想,真的很有点击的问题,LBButton实例对象调用自身的方法click,然而身为LBButton实例对象的委托代理对象listener却主动调用起委托方法onclick: , 这就是委托设计模式的效果和作用!

总结起来就是,LBButton对象定义了一个id类型的委托<LBButtonDelegate>对象,将其代理人设置成LBListener对象(编程的角度来讲,即是定义了一个id类型的指针,并把这个指针指向你想要用来实现的那个对象),从而执行id类型的onClick:方法的时候是通过LBListener对象来执行的。从而实现我自己不想做,交给别人做的效果!所谓的delegate的页面间传值也不过如此嘛。而这个例子要理解起来最重要的还是对指针的熟悉理解,将委托对象delegate置为LBListener对象,而在click方法中使用LBListener对象来实现方法,并将自身self作为参数。


通过这个例子,理解UITableView的delegate就不难了。UITableView这个类本身定义了delegate和dataSource这两个委托类,并且相关的协议有一系列关于列表的方法,然而UITableView自己不会去一一实现,交给ViewController来实现,从而完成委托模式!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值