开源中国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;     [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;//完成加载时调用此方法


MessageSystemView.m
#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


.m文件里
- (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




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


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





     本文转自新风作浪 51CTO博客,原文链接http://blog.51cto.com/duxinfeng/1208693:,如需转载请自行联系原作者



目录
打赏
0
0
0
0
348
分享
相关文章
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
228 0
学习iOS开发的准备
准备学习iOS开发?确保有Mac和最新Xcode,先学好编程基础特别是Swift。利用Apple官方文档、在线课程和书籍作为资源。熟悉Xcode及Git,通过实践项目和开源代码积累经验。深研架构模式、核心框架和优化技巧。加入开发者社区,关注行业动态,持续学习。
78 1
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
145 0
鸿蒙开发|鸿蒙系统的介绍(为什么要学习鸿蒙开发|鸿蒙系统的官方定义|鸿蒙和安卓、ios的对比)
鸿蒙开发学习是一项探索性的工作,旨在开发一个全场景分布式操作系统,覆盖所有设备,让消费者能够更方便、更直观地使用各种设备。
871 6
鸿蒙开发|鸿蒙系统的介绍(为什么要学习鸿蒙开发|鸿蒙系统的官方定义|鸿蒙和安卓、ios的对比)
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
无影ios & Android客户端6.0.0版本发布!移动端触控体验更舒适,用户操作更便捷,一起来看看!
887 0
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
iOS UIKit Dynamics Demo 学习地址列表
iOS UIKit Dynamics Demo 学习地址列表
95 0
调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
617 1
一点就通,社交源码IOS客户端开发集成SDK
所谓SDK,全称是SoftwaredevelopmentKit,翻译成软件开发工具包。SDK用助开发某种软件,今天给大家简单讲解下如何在社交源码IOS客户端上开发集成 SDK。
一点就通,社交源码IOS客户端开发集成SDK
所谓SDK,全称是SoftwaredevelopmentKit,翻译成软件开发工具包。SDK用助开发某种软件,今天给大家简单讲解下如何在社交源码IOS客户端上开发集成 SDK。
iOS 逆向编程(八)远程拷贝 - 客户端(电脑)通过 ssh 拷贝文件到服务端(手机)
iOS 逆向编程(八)远程拷贝 - 客户端(电脑)通过 ssh 拷贝文件到服务端(手机)
145 0

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    96
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    56
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    84
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    131
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    38
  • 6
    iOS各个证书生成细节
    56
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    263
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    82
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    94
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    77