开源中国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;
- -(void)viewDidLoad
- {
- allCount=0;
- [superviewDidLoad];
- if(self.tabTitle){
- self.tabBarItem.title=self.tabTitle;
- }
- //加载固定数据
- imageDownloadsInProgress=[NSMutableDictionarydictionary];
- comments=[[NSMutableArrayalloc]initWithCapacity:10];
- [selfreload:YES];
- //添加的代码
- if(_refreshHeaderView==nil){
- <spanstyle="color:#ff0000;">EGORefreshTableHeaderView*view=[[EGORefreshTableHeaderViewalloc]initWithFrame:CGRectMake(0.0f,-320.0f,self.view.frame.size.width,320)];
- view.delegate=self;</span>
- [self.tableCommentsaddSubview:view];
- <spanstyle="color:#ff0000;">_refreshHeaderView=view;</span>
- }
- [_refreshHeaderViewrefreshLastUpdatedDate];
- self.tableComments.backgroundColor=[UIColorcolorWithRed:248.0/255.0green:249.0/255.0blue:249.0/255.0alpha:1.0];
- }
(4)在被委托类的实现文件中调用协议方法,这就是实现委托方法的一个过程;
此处EGORefreshTableHeaderView类对象委托MessageSystemView类对象,在MessageSystemView实现对EGORefreshTableHeaderView类协议的调用;
MessageSystemView.m文件实现委托方法
- -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
- {
- [selfreloadTableViewDataSource];
- [selfrefresh];
- }
- -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
- {
- return_reloading;
- }
- -(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
- {
- return[NSDatedate];
- }
当然要实现完整的下拉功能这几个委托只是其中一部分,被委托类里还需要有自己的成员函数,在委托方法正在被调用的时候触发被委托成员函数方法,在
MessageSystemView.h
- //下拉刷新
- -(void)refresh;//解析网络数据,让数据显示到视图上
- -(void)reloadTableViewDataSource;//开始加载时调用此方法
- -(void)doneLoadingTableViewData;//完成加载时调用此方法
- #pragma下提刷新
- -(void)reloadTableViewDataSource
- {
- _reloading=YES;
- }
- -(void)doneLoadingTableViewData
- {
- _reloading=NO;
- [_refreshHeaderViewegoRefreshScrollViewDataSourceDidFinishedLoading:self.tableComments];
- }
- -(void)scrollViewDidScroll:(UIScrollView*)scrollView
- {
- [_refreshHeaderViewegoRefreshScrollViewDidScroll:scrollView];
- }
- -(void)scrollViewDidEndDragging:(UIScrollView*)scrollViewwillDecelerate:(BOOL)decelerate
- {
- [_refreshHeaderViewegoRefreshScrollViewDidEndDragging:scrollView];
- }
- -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
- {
- [selfreloadTableViewDataSource];
- [selfrefresh];
- }
- -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
- {
- return_reloading;
- }
- -(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
- {
- return[NSDatedate];
- }
- -(void)refresh
- {
- isLoadOver=NO;
- [selfreload:NO];
- }
根据这些练习了一个简单的下拉刷新Demo
效果图
.h文件里
- #import<UIKit/UIKit.h>
- #import"EGORefreshTableHeaderView.h"
- @interfaceViewController:UIViewController<UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>
- {
- EGORefreshTableHeaderView*_refreshHeaderView;
- BOOL_reloading;
- }
- @property(retain,nonatomic)IBOutletUITableView*tableView;
- -(void)reloadTableViewDataSource;
- -(void)doneLoadingTableViewData;
- @end
- -(void)viewDidLoad
- {
- [superviewDidLoad];
- //Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
- if(_refreshHeaderView==nil){
- EGORefreshTableHeaderView*view=[[EGORefreshTableHeaderViewalloc]initWithFrame:CGRectMake(0.0f,-self.tableView.frame.size.height,self.view.frame.size.width,self.tableView.frame.size.height)];
- view.delegate=self;
- [self.tableViewaddSubview:view];
- _refreshHeaderView=view;
- [viewrelease];
- }
- [_refreshHeaderViewrefreshLastUpdatedDate];
- }
- //重新加载时调用
- -(void)reloadTableViewDataSource
- {
- _reloading=YES;
- }
- //完成加载时调用
- -(void)doneLoadingTableViewData
- {
- _reloading=NO;
- [_refreshHeaderViewegoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
- }
- #pragmamark-
- #pragmamarkUIScrollViewDelegateMethods
- -(void)scrollViewDidScroll:(UIScrollView*)scrollView
- {
- [_refreshHeaderViewegoRefreshScrollViewDidScroll:scrollView];
- }
- -(void)scrollViewDidEndDragging:(UIScrollView*)scrollViewwillDecelerate:(BOOL)decelerate
- {
- [_refreshHeaderViewegoRefreshScrollViewDidEndDragging:scrollView];
- }
- #pragmamark-
- #pragmamarkEGORefreshTableHeaderDelegateMethods
- -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
- {
- [selfreloadTableViewDataSource];
- [selfperformSelector:@selector(doneLoadingTableViewData)withObject:nilafterDelay:3.0];
- }
- -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
- {
- return_reloading;
- }
- -(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view
- {
- return[NSDatedate];
- }
- #pragmamark-
- #pragmamarkUITableViewDataSource
- -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
- {
- return1;
- }
- -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section
- {
- return3;
- }
- -(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath
- {
- staticNSString*[email protected]"cell";
- UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:cellIdentifier];
- if(cell==nil){
- cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdentifier];
- }
- [email protected]"下拉刷新测试";
- returncell;
- }
源码:http://download.****.net/detail/duxinfeng2010/4902782
正在学习过程中,错误之处请指正,欢迎交流,共同学习;