Objective-c 初识协议--protocol

最近买了台MBP苦学objective-c,网上的视频以及书籍大多数都是xcode3以及之前的版本,也就是IOS4及之前的版本,这对本来编程基础就不好的我来说更加难以入手,考虑再三,决定看斯坦福2011年的公开课,ipad and iphone application development。用quiktime播放可以调出英文字幕,这给了我很大的帮助,基本上就是出一行字幕然后暂停看是什么意思,纯用耳朵听懂那个老教授讲的实在是太困难了。

边学边记,可能会有不妥之地,欢迎指正,随时修改。

Objective 之协议---protocol

个人理解,协议,就是当一个数据源需要与一个view进行绑定时(view无法存放数据,只能通过controller来获取数据),需要遵守view所提出的一系列规则,也就是这个协议。协议可以定义在单独的一个.h文件里,但也可以定义在所描述的这个view的.h文件里。

某一个controller如果想要给view提供数据,则需要继承?(这个地方算是继承么?)view所提出的协议,并且实现协议所要求的方法。

实例一个简单的MVC,在斯坦福公开课2011年秋的第六课里。

 

FaceView 是一个笑脸View,其笑容程度由controller中的数据源控制,happiness,float类型。即需要FaceView通过协议与Controller的数据源绑定。

这里需要FaceView里面的FaceViewDataSource协议来定义一个规则,数据源继承了这个协议之后即可给FaceView提供数据。

FaceView.h

#import <UIKit/UIKit.h>
@protocol FaceViewDataSource; //forward reference 向前引用

@interface FaceView : UIView

@property (nonatomic) CGFloat scale;

@property (nonatomic ,weak) IBOutlet id<FaceViewDataSource> dataSource;//作用是,在继承了该协议的controller中,可以在setfaceview方法内使用 self. faceView.dataSource = self;
- (void)pinches:(UIPinchGestureRecognizer *)gesture;

@end


//协议
@protocol FaceViewDataSource <NSObject>

- (float) smileForFaceView :(FaceView *)sender;

@end


FaceView.m中,需要Synthesize这个协议,类型为id,因为,这个View并不知道是什么样的数据源来提供数据。下面代码中只给出与协议相关的代码。smile是笑脸的值,调用在协议中所制定的方法来获取数据源的数据。这个方法需要在controller里重写

@implementation FaceView

@synthesize dataSource = _dataSource;

float smile = [self.dataSource smileForFaceView:self] ;

HappinessViewController.m中,首先要继承上面的协议,并按规定重写协议的方法,当view调用该方法时,即可返回数据。(协议相关代码)

@interface HappinessViewController () <FaceViewDataSource>

- (float) smileForFaceView:(FaceView *)sender
{
return (self.hapiness - 50) / 50.0;
}


self.faceView.dataSource = self;//讲faceView的dataSource设置为自身 也就是为什么上面的property会用id类型。





转载于:https://www.cnblogs.com/wondersure/archive/2012/03/07/2384128.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值