iOS裏委託與協議是很重要的一塊,若是理解很差很難區分協議與委託到底有什麼不同,這些東西在開發中是常常碰見的; 設計模式
協議是類留給外部的一個接口函數的集合(一位高手用C++基類來解釋是,把接口作爲參數,回調基類的函數時,運行時識別,調用了相應子類的成員函數);
網絡
委託是iOS一種設計模式,經過委託別的類,來調用協議裏的方法,至關於一個回調過程; app
使用理解委託與協議步驟: 函數
(1) 弄清楚誰委託誰,須要幹什麼? 學習
拿上一篇博客下拉刷新源碼案例分析,(在源碼工程中comment文件夾裏)有MessageSystemView這樣一個類,該類用於用戶的信息所用(好比誰給你留言,或者評論了你某一篇博客),咱們也須要刷新獲取最新信息,此處用到下拉刷新第三方類庫EGORefreshTableHeaderView類委託MessageSystemView類來實現這個特性,這就須要在EGORefreshTableHeaderView類定義一個協議對象delegate。 測試
(2)被委託類須要在interface中聲明<XXDelegate>,表示該類要實現協議裏的方法. atom
MessageSystemView實現EGORefreshTableHeaderView協議方法就要遵循EGORefreshTableHeaderDelegate協議. spa
(3)在被委託類裏定義一個委託類的對象,將xx.delegate=self,意思是把委託的對象只想被委託對象; .net
在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.csdn.net/detail/duxinfeng2010/4902782
正在學習過程當中,錯誤之處請指正,歡迎交流,共同窗習;