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;
MessageSystemView.m
-
#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
.m文件里
-
-(void)viewDidLoad
-
{
-
[superviewDidLoad];
-
-
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*cellIdentifier=@"cell";
-
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:cellIdentifier];
-
if(cell==nil){
-
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdentifier];
-
}
-
cell.textLabel.text=@"下拉刷新测试";
-
returncell;
-
}
源码:http://download.csdn.net/detail/duxinfeng2010/4902782
正在学习过程中,错误之处请指正,欢迎交流,共同学习;
欢迎转载分享,请注明出处http://blog.csdn.net/duxinfeng2010
分享到:
相关推荐
2022修复源支付5.18新版协议去授权全套三端开源源码_客户端+云端+监控+协议三网免挂免输入 推荐系统为: CentOS 7.6 Linux系统环境: Nginx 1.20.1+ MySQL 5.6.50+ PHP-7.2+ Redis 将商户后台源码上传解压运行目录为...
开源中国iOS客户端学习——(三)再看协议与委托,http://blog.csdn.net/duxinfeng2010/article/category/1155790
OSCHINA 的 iPhone 客户端源码,可直接在 App Store上搜索“开源中国”来安装此app
IOS应用源码——一些iPhone开源项目代码iphone-tris.rar
IOS应用源码——一些iPhone开源项目代码Unicode.zip
智能家居系统客户端实现,基于Android Studio开发,可以实现对窗帘、台灯、插座、客厅、卧室等家居家电的控制
IOS应用源码——一些iPhone开源项目代码iflickr.zip
IOS应用源码——方方引擎开源框架.zip
Coding-StartGuidePage-01 IOS开源Coding客户端学习——(一)启动引导页面 #效果图一 #效果图二
开源中国 iOS 客户端完整源码,Github 不断维护中的项目 欢迎下载参考
IOS应用源码——一些iPhone开源项目代码SplashDemo.zip
IOS应用源码——一些iPhone开源项目代码SenseOfMed.zip
IOS应用源码——一些iPhone开源项目代码iphone-tris.zip
IOS应用源码——一些iPhone开源项目代码TempFileReadWrite.zip
IOS应用源码——一些iPhone开源项目代码ImagePickerDemo.zip
IOS应用源码——一些iPhone开源项目代码SenseOfMed.rar
IOS应用源码——一些iPhone开源项目代码TempFileReadWrite.rar
IOS应用源码——一些iPhone开源项目代码SplashDemo.rar
IOS应用源码——一些iPhone开源项目代码ImagePickerDemo.rar
IOS应用源码——一些iPhone开源项目代码iflickr.rar