开源中国iOS客户端学习——(三)再看协议与委托
来源:互联网 发布:网络银行的特点 编辑:程序博客网 时间:2024/05/22 01:27
iOS里委托与协议是很重要的一块,如果理解不好很难区分协议与委托到底有什么不一样,这些东西在开发中是经常遇见的;
协议是类留给外部的一个接口函数的集合(一位高手用C++基类来解释是,把接口做为参数,回调基类的函数时,运行时识别,调用了相应子类的成员函数);
委托是iOS一种设计模式,通过委托别的类,来调用协议里的方法,相当于一个回调过程;
使用理解委托与协议步骤:
(1) 弄清楚谁委托谁,需要干什么?
拿上一篇博客下拉刷新源码案例分析,(在源码工程中comment文件夹里)有MessageSystemView这样一个类,该类用于用户的信息所用(比如谁给你留言,或者评论了你某一篇博客),我们也需要刷新获取最新信息,此处用到下拉刷新第三方类库EGORefreshTableHeaderView类委托MessageSystemView类来实现这个特性,这就需要在EGORefreshTableHeaderView类定义一个协议对象delegate。
(2)被委托类需要在interface中声明<XXDelegate>,表示该类要实现协议里的方法.
MessageSystemView实现EGORefreshTableHeaderView协议方法就要遵循EGORefreshTableHeaderDelegate协议.
(3)在被委托类里定义一个委托类的对象,将xx.delegate=self,意思是把委托的对象只想被委托对象;
在EGORefreshTableHeaderView.h文件中
EGORefreshTableHeaderView*_refreshHeaderView;
在ViewDidLoad中 view.delegate = self; _refreshHeaderView = view;
- (void)viewDidLoad{ allCount = 0; [super viewDidLoad]; if (self.tabTitle) { self.tabBarItem.title = self.tabTitle; } //加载固定数据 imageDownloadsInProgress = [NSMutableDictionary dictionary]; comments = [[NSMutableArray alloc] initWithCapacity:10]; [self reload:YES]; //添加的代码 if (_refreshHeaderView == nil) { EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)]; view.delegate = self; [self.tableComments addSubview:view]; _refreshHeaderView = view; } [_refreshHeaderView refreshLastUpdatedDate]; self.tableComments.backgroundColor = [UIColor colorWithRed:248.0/255.0 green:249.0/255.0 blue:249.0/255.0 alpha:1.0];}
(4)在被委托类的实现文件中调用协议方法,这就是实现委托方法的一个过程;
此处EGORefreshTableHeaderView类对象委托MessageSystemView类对象,在MessageSystemView实现对EGORefreshTableHeaderView类协议的调用;
MessageSystemView.m文件实现委托方法
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{ [self reloadTableViewDataSource]; [self refresh];}- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{ return _reloading;}- (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{ return [NSDate date];}
当然要实现完整的下拉功能这几个委托只是其中一部分,被委托类里还需要有自己的成员函数,在委托方法正在被调用的时候触发被委托成员函数方法,在
MessageSystemView.h
//下拉刷新- (void)refresh;//解析网络数据,让数据显示到视图上- (void)reloadTableViewDataSource;//开始加载时调用此方法- (void)doneLoadingTableViewData;//完成加载时调用此方法
#pragma 下提刷新- (void)reloadTableViewDataSource{ _reloading = YES;}- (void)doneLoadingTableViewData{ _reloading = NO; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableComments];}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];}- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];}- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{ [self reloadTableViewDataSource]; [self refresh];}- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{ return _reloading;}- (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{ return [NSDate date];}- (void)refresh{ isLoadOver = NO; [self reload:NO];}
根据这些练习了一个简单的下拉刷新Demo
效果图
.h文件里
#import <UIKit/UIKit.h>#import "EGORefreshTableHeaderView.h"@interface ViewController : UIViewController<UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource, EGORefreshTableHeaderDelegate>{ EGORefreshTableHeaderView *_refreshHeaderView; BOOL _reloading;}@property (retain, nonatomic) IBOutlet UITableView *tableView;-(void)reloadTableViewDataSource;-(void)doneLoadingTableViewData;@end
- (void)viewDidLoad{ [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. if (_refreshHeaderView == nil) { EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -self.tableView.frame.size.height, self.view.frame.size.width, self.tableView.frame.size.height)]; view.delegate = self; [self.tableView addSubview:view]; _refreshHeaderView = view; [view release]; } [_refreshHeaderView refreshLastUpdatedDate];}//重新加载时调用-(void)reloadTableViewDataSource{ _reloading = YES;}//完成加载时调用-(void)doneLoadingTableViewData{ _reloading = NO; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];}#pragma mark -#pragma mark UIScrollViewDelegate Methods-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];}-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];}#pragma mark -#pragma mark EGORefreshTableHeaderDelegate Methods-(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{ [self reloadTableViewDataSource]; [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];}-(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{ return _reloading;}-(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{ return [NSDate date];}#pragma mark -#pragma mark UITableViewDataSource-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1;}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 3;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *cellIdentifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell==nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.text = @"下拉刷新测试"; return cell;}
源码:http://download.csdn.net/detail/duxinfeng2010/4902782
正在学习过程中,错误之处请指正,欢迎交流,共同学习;
- 开源中国iOS客户端学习——(三)再看协议与委托
- 开源中国iOS客户端学习——(三)再看协议与委托
- 开源中国iOS客户端学习——(三)再看协议与委托
- ios学习(三) 谈谈协议与委托
- 开源中国iOS客户端学习——序
- 开源中国iOS客户端学习——序
- 开源中国iOS客户端学习——MBProgressHUD特效
- 开源中国iOS客户端学习—AES加密
- 开源中国IOS客户端学习
- IOS学习笔记之协议与委托
- iOS开源项目学习——开源中国iOS客户端
- ios委托与协议
- ios协议与委托
- iOS 协议与委托
- IOS协议与委托
- IOS协议与委托
- ios学习(零) 开源中国iOS客户端学习
- 再看委托与事件
- 少编码多思考:代码越多 问题越多
- Java编程中写出好代码的建议
- httpclient实现代理登录和信息抓取--2011初
- 元类示例1 meta1.py
- STL中list的使用
- 开源中国iOS客户端学习——(三)再看协议与委托
- 忍俊不禁
- python迭代器和生成器
- subView的添加与移除
- 群联MPALL v3.23.00量产工具(可刷PS2251-50固件)
- Win7 +CUDA5.0 + Visual Studio 2010 的环境配置
- 设置保护眼睛颜色
- ORACLE全局索引、分区索引
- LTRIM、RTRIM和TRIM在ORACLE中的用法