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

来源:互联网 发布:网络银行的特点 编辑:程序博客网 时间:2024/05/22 01: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;

- (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


原创粉丝点击