`
yidongkaifa
  • 浏览: 4038304 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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. [superviewDidLoad];
  5. if(self.tabTitle){
  6. self.tabBarItem.title=self.tabTitle;
  7. }
  8. //加载固定数据
  9. imageDownloadsInProgress=[NSMutableDictionarydictionary];
  10. comments=[[NSMutableArrayalloc]initWithCapacity:10];
  11. [selfreload:YES];
  12. //添加的代码
  13. if(_refreshHeaderView==nil){
  14. <spanstyle="color:#ff0000;">EGORefreshTableHeaderView*view=[[EGORefreshTableHeaderViewalloc]initWithFrame:CGRectMake(0.0f,-320.0f,self.view.frame.size.width,320)];
  15. view.delegate=self;</span>
  16. [self.tableCommentsaddSubview:view];
  17. <spanstyle="color:#ff0000;">_refreshHeaderView=view;</span>
  18. }
  19. [_refreshHeaderViewrefreshLastUpdatedDate];
  20. self.tableComments.backgroundColor=[UIColorcolorWithRed:248.0/255.0green:249.0/255.0blue:249.0/255.0alpha:1.0];
  21. }


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

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

MessageSystemView.m文件实现委托方法

  1. -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
  2. {
  3. [selfreloadTableViewDataSource];
  4. [selfrefresh];
  5. }
  6. -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
  7. {
  8. return_reloading;
  9. }
  10. -(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
  11. {
  12. return[NSDatedate];
  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. [_refreshHeaderViewegoRefreshScrollViewDataSourceDidFinishedLoading:self.tableComments];
  10. }
  11. -(void)scrollViewDidScroll:(UIScrollView*)scrollView
  12. {
  13. [_refreshHeaderViewegoRefreshScrollViewDidScroll:scrollView];
  14. }
  15. -(void)scrollViewDidEndDragging:(UIScrollView*)scrollViewwillDecelerate:(BOOL)decelerate
  16. {
  17. [_refreshHeaderViewegoRefreshScrollViewDidEndDragging:scrollView];
  18. }
  19. -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
  20. {
  21. [selfreloadTableViewDataSource];
  22. [selfrefresh];
  23. }
  24. -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
  25. {
  26. return_reloading;
  27. }
  28. -(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
  29. {
  30. return[NSDatedate];
  31. }
  32. -(void)refresh
  33. {
  34. isLoadOver=NO;
  35. [selfreload:NO];
  36. }



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

效果图



.h文件里

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


.m文件里
  1. -(void)viewDidLoad
  2. {
  3. [superviewDidLoad];
  4. //Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
  5. if(_refreshHeaderView==nil){
  6. EGORefreshTableHeaderView*view=[[EGORefreshTableHeaderViewalloc]initWithFrame:CGRectMake(0.0f,-self.tableView.frame.size.height,self.view.frame.size.width,self.tableView.frame.size.height)];
  7. view.delegate=self;
  8. [self.tableViewaddSubview:view];
  9. _refreshHeaderView=view;
  10. [viewrelease];
  11. }
  12. [_refreshHeaderViewrefreshLastUpdatedDate];
  13. }
  14. //重新加载时调用
  15. -(void)reloadTableViewDataSource
  16. {
  17. _reloading=YES;
  18. }
  19. //完成加载时调用
  20. -(void)doneLoadingTableViewData
  21. {
  22. _reloading=NO;
  23. [_refreshHeaderViewegoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
  24. }
  25. #pragmamark-
  26. #pragmamarkUIScrollViewDelegateMethods
  27. -(void)scrollViewDidScroll:(UIScrollView*)scrollView
  28. {
  29. [_refreshHeaderViewegoRefreshScrollViewDidScroll:scrollView];
  30. }
  31. -(void)scrollViewDidEndDragging:(UIScrollView*)scrollViewwillDecelerate:(BOOL)decelerate
  32. {
  33. [_refreshHeaderViewegoRefreshScrollViewDidEndDragging:scrollView];
  34. }
  35. #pragmamark-
  36. #pragmamarkEGORefreshTableHeaderDelegateMethods
  37. -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
  38. {
  39. [selfreloadTableViewDataSource];
  40. [selfperformSelector:@selector(doneLoadingTableViewData)withObject:nilafterDelay:3.0];
  41. }
  42. -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
  43. {
  44. return_reloading;
  45. }
  46. -(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
  47. {
  48. return[NSDatedate];
  49. }
  50. #pragmamark-
  51. #pragmamarkUITableViewDataSource
  52. -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
  53. {
  54. return1;
  55. }
  56. -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section
  57. {
  58. return3;
  59. }
  60. -(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath
  61. {
  62. staticNSString*cellIdentifier=@"cell";
  63. UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:cellIdentifier];
  64. if(cell==nil){
  65. cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdentifier];
  66. }
  67. cell.textLabel.text=@"下拉刷新测试";
  68. returncell;
  69. }


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




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


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

相关推荐

Global site tag (gtag.js) - Google Analytics