最近买了台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类型。