开源中国iOS客户端学习——(三)再看协议与委托

转载 2013年12月02日 17:41: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;

  1. - (void)viewDidLoad  
  2. {  
  3.     allCount = 0;  
  4.     [super viewDidLoad];  
  5.       
  6.     if (self.tabTitle) {  
  7.         self.tabBarItem.title = self.tabTitle;  
  8.     }  
  9.       
  10.     //加载固定数据  
  11.     imageDownloadsInProgress = [NSMutableDictionary dictionary];  
  12.     comments = [[NSMutableArray alloc] initWithCapacity:10];  
  13.     [self reload:YES];  
  14.       
  15.     //添加的代码  
  16.     if (_refreshHeaderView == nil) {  
  17.        <span style="color:#ff0000;"> EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)];  
  18.         view.delegate = self;</span>  
  19.         [self.tableComments addSubview:view];  
  20.         <span style="color:#ff0000;">_refreshHeaderView = view;</span>  
  21.     }  
  22.     [_refreshHeaderView refreshLastUpdatedDate];  
  23.       
  24.     self.tableComments.backgroundColor = [UIColor colorWithRed:248.0/255.0 green:249.0/255.0 blue:249.0/255.0 alpha:1.0];  
  25. }  


(4)在被委托类的实现文件中调用协议方法,这就是实现委托方法的一个过程;

此处EGORefreshTableHeaderView类对象委托MessageSystemView类对象,在MessageSystemView实现对EGORefreshTableHeaderView类协议的调用;

MessageSystemView.m文件实现委托方法

  1. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view  
  2. {  
  3.     [self reloadTableViewDataSource];  
  4.     [self refresh];  
  5. }  
  6. - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view  
  7. {  
  8.     return _reloading;  
  9. }  
  10. - (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view  
  11. {  
  12.     return [NSDate date];  
  13. }  


当然要实现完整的下拉功能这几个委托只是其中一部分,被委托类里还需要有自己的成员函数,在委托方法正在被调用的时候触发被委托成员函数方法,在


MessageSystemView.h

  1. //下拉刷新  
  2. - (void)refresh;//解析网络数据,让数据显示到视图上  
  3. - (void)reloadTableViewDataSource;//开始加载时调用此方法  
  4. - (void)doneLoadingTableViewData;//完成加载时调用此方法  


MessageSystemView.m
  1. #pragma 下提刷新  
  2. - (void)reloadTableViewDataSource  
  3. {  
  4.     _reloading = YES;  
  5. }  
  6. - (void)doneLoadingTableViewData  
  7. {  
  8.     _reloading = NO;  
  9.     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableComments];  
  10. }  
  11. - (void)scrollViewDidScroll:(UIScrollView *)scrollView  
  12. {  
  13.     [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];  
  14. }  
  15. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
  16. {  
  17.     [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];  
  18. }  
  19. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view  
  20. {  
  21.     [self reloadTableViewDataSource];  
  22.     [self refresh];  
  23. }  
  24. - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view  
  25. {  
  26.     return _reloading;  
  27. }  
  28. - (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view  
  29. {  
  30.     return [NSDate date];  
  31. }  
  32. - (void)refresh  
  33. {  
  34.     isLoadOver = NO;  
  35.     [self reload:NO];  
  36. }  



根据这些练习了一个简单的下拉刷新Demo

效果图

  

.h文件里

  1. #import <UIKit/UIKit.h>  
  2. #import "EGORefreshTableHeaderView.h"  
  3. @interface ViewController : UIViewController<UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource, EGORefreshTableHeaderDelegate>  
  4. {  
  5.     EGORefreshTableHeaderView *_refreshHeaderView;  
  6.     BOOL _reloading;  
  7.   
  8. }  
  9. @property (retain, nonatomic) IBOutlet UITableView *tableView;  
  10.   
  11. -(void)reloadTableViewDataSource;  
  12. -(void)doneLoadingTableViewData;  
  13. @end  


.m文件里
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view, typically from a nib.  
  5.     if (_refreshHeaderView == nil) {  
  6.         EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -self.tableView.frame.size.height, self.view.frame.size.width, self.tableView.frame.size.height)];  
  7.         view.delegate = self;  
  8.           
  9.         [self.tableView addSubview:view];  
  10.         _refreshHeaderView = view;  
  11.         [view release];  
  12.     }  
  13.     [_refreshHeaderView refreshLastUpdatedDate];  
  14. }  
  15. //重新加载时调用  
  16. -(void)reloadTableViewDataSource  
  17. {  
  18.     _reloading = YES;  
  19. }  
  20. //完成加载时调用  
  21. -(void)doneLoadingTableViewData  
  22. {  
  23.     _reloading = NO;  
  24.     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];  
  25. }  
  26.   
  27.   
  28. #pragma mark -  
  29. #pragma mark UIScrollViewDelegate Methods  
  30.   
  31. -(void)scrollViewDidScroll:(UIScrollView *)scrollView  
  32. {  
  33.     [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];  
  34. }  
  35.   
  36. -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
  37. {  
  38.     [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];  
  39. }  
  40.   
  41. #pragma mark -  
  42. #pragma mark EGORefreshTableHeaderDelegate Methods  
  43.   
  44. -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view  
  45. {  
  46.     [self reloadTableViewDataSource];  
  47.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];  
  48. }  
  49.   
  50. -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view  
  51. {  
  52.     return _reloading;  
  53. }  
  54.   
  55. -(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view  
  56. {  
  57.     return [NSDate date];  
  58. }  
  59.   
  60.   
  61. #pragma mark -  
  62. #pragma mark UITableViewDataSource  
  63.   
  64. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  65. {  
  66.     return 1;  
  67. }  
  68.   
  69. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  70. {  
  71.     return 3;  
  72. }  
  73.   
  74. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  75. {  
  76.   
  77.     static NSString *cellIdentifier = @"cell";  
  78.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];  
  79.     if (cell==nil) {  
  80.         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];  
  81.     }  
  82.     cell.textLabel.text = @"下拉刷新测试";  
  83.     return  cell;  
  84. }  


源码:http://download.csdn.net/detail/duxinfeng2010/4902782




正在学习过程中,错误之处请指正,欢迎交流,共同学习;


欢迎转载分享,请注明出处http://blog.csdn.net/duxinfeng2010

相关文章推荐

开源中国iOS客户端学习——(三)再看协议与委托

iOS里委托与协议是很重要的一块,如果理解不好很难区分协议与委托到底有什么不一样,这些东西在开发中是经常遇见的; 协议是类留给外部的一个接口函数的集合(一位高手用C++基类来解释是,把接口做为参数,...

开源中国iOS客户端学习——(五)网络通信ASI类库(1)

转载自:http://blog.csdn.net/duxinfeng2010/article/details/8453749   开源中国iOS客户端学习——(五)网络通信AS...

开源中国iOS客户端学习——(十四)使用EGOImageLoading异步加载图片

EGOImageLoading 是一个用的比较多的异步加载图片的第三方类库,简化开发过程,我们直接传入图片的url,这个类库就会自动帮我们异步加载和缓存工作;当从网上获取图片时,如果网速慢图片短时间内...

开源中国iOS客户端学习——(十二)用户登陆

上一篇博客  开源中国iOS客户端学习——(十一)AES加密 中提到将用户名和密码保存到了本地沙盒之中,在从本地读取用户名和密码,这是一个怎样的过程? -(void)saveUserNameAndP...

开源中国iOS客户端学习——(八)网络通信AFNetworking类库

转载自:http://blog.csdn.net/duxinfeng2010/article/details/8620901   开源中国iOS客户端学习——(八)网络通信AF...

开源中国iOS客户端学习——(十三)使用UIWebView控件布局视图

在上一篇博客   开源中国iOS客户端学习——(十二)用户登陆  中讲到用户登陆界面,loginView.xib布局中我们看到有一个UIWebView控件,但是它并没有加载一个网页,而是显示一些文...

开源中国iOS客户端学习——(四)GCDiscreetNotificationView提示视图

GCDiscreetNotificationView 类库作用是: 在不阻止用户与设备应用程序交互情况下,作为一个通知视图来显示一个当前的状态。 GCDiscreetNotificationVi...

开源中国iOS客户端学习——(七)MBProgressHUD特效

在开源中国iOS客户端中也用到了MBProgressHUD这个特效,主要作用为应用显示一个过渡的作用,常用于打开一个联网页面加载过程,防止出现假死现象,如果网速慢则告诉用户已经在很努力很努力的加载中。...

开源中国iOS客户端学习——(十一)AES加密

2013-05-22 11:14 13473人阅读 评论(10) 收藏 举报 开源中国iOS客户端学习AES加密 http://blog.csdn.net/duxinfeng2010/ar...

[置顶] 开源中国iOS客户端学习——(十一)AES加密

数据加密在解密在软件开发过程中举足轻重的作用,可能有的公司在加密的时候有自己公司内部一套设计的算法,而在这方面不想浪费太大精力就可以去考虑使用第三方提供的加密算法,如AES加密算法,本篇内容介绍开源中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开源中国iOS客户端学习——(三)再看协议与委托
举报原因:
原因补充:

(最多只允许输入30个字)