ios学习(三) 谈谈协议与委托

本文详细介绍了iOS开发中委托与协议的概念及应用,通过具体案例分析了如何利用第三方类库EGORefreshTableHeaderView实现下拉刷新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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) {  
       <span style="color:#ff0000;"> EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)];  
        view.delegate = self;</span>  
        [self.tableComments addSubview:view];  
        <span style="color:#ff0000;">_refreshHeaderView = view;</span>  
    }  
    [_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.youkuaiyun.com/detail/duxinfeng2010/4902782



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值