溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

開源中國iOS客戶端學習——(三)再看協(xié)議與委托

發(fā)布時間:2020-06-24 18:10:38 來源:網(wǎng)絡 閱讀:472 作者:新風作浪 欄目:移動開發(fā)

iOS里委托與協(xié)議是很重要的一塊,如果理解不好很難區(qū)分協(xié)議與委托到底有什么不一樣,這些東西在開發(fā)中是經(jīng)常遇見的;

協(xié)議是類留給外部的一個接口函數(shù)的集合(一位高手用C++基類來解釋是,把接口做為參數(shù),回調(diào)基類的函數(shù)時,運行時識別,調(diào)用了相應子類的成員函數(shù));

委托是iOS一種設計模式,通過委托別的類,來調(diào)用協(xié)議里的方法,相當于一個回調(diào)過程;


使用理解委托與協(xié)議步驟:

(1) 弄清楚誰委托誰,需要干什么?

拿上一篇博客下拉刷新源碼案例分析,(在源碼工程中comment文件夾里)有MessageSystemView這樣一個類,該類用于用戶的信息所用(比如誰給你留言,或者評論了你某一篇博客),我們也需要刷新獲取最新信息,此處用到下拉刷新第三方類庫EGORefreshTableHeaderView類委托MessageSystemView類來實現(xiàn)這個特性,這就需要在EGORefreshTableHeaderView類定義一個協(xié)議對象delegate。


(2)被委托類需要在interface中聲明<XXDelegate>,表示該類要實現(xiàn)協(xié)議里的方法.

MessageSystemView實現(xiàn)EGORefreshTableHeaderView協(xié)議方法就要遵循EGORefreshTableHeaderDelegate協(xié)議.


(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;     }          //加載固定數(shù)據(jù)     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)在被委托類的實現(xiàn)文件中調(diào)用協(xié)議方法,這就是實現(xiàn)委托方法的一個過程;

此處EGORefreshTableHeaderView類對象委托MessageSystemView類對象,在MessageSystemView實現(xiàn)對EGORefreshTableHeaderView類協(xié)議的調(diào)用;

MessageSystemView.m文件實現(xiàn)委托方法

- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view {     [self reloadTableViewDataSource];     [self refresh]; } - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view {     return _reloading; } - (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view {     return [NSDate date]; }


當然要實現(xiàn)完整的下拉功能這幾個委托只是其中一部分,被委托類里還需要有自己的成員函數(shù),在委托方法正在被調(diào)用的時候觸發(fā)被委托成員函數(shù)方法,在


MessageSystemView.h

//下拉刷新 - (void)refresh;//解析網(wǎng)絡數(shù)據(jù),讓數(shù)據(jù)顯示到視圖上 - (void)reloadTableViewDataSource;//開始加載時調(diào)用此方法 - (void)doneLoadingTableViewData;//完成加載時調(diào)用此方法


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]; } 



根據(jù)這些練習了一個簡單的下拉刷新Demo

效果圖

開源中國iOS客戶端學習——(三)再看協(xié)議與委托 開源中國iOS客戶端學習——(三)再看協(xié)議與委托 開源中國iOS客戶端學習——(三)再看協(xié)議與委托

.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]; } //重新加載時調(diào)用 -(void)reloadTableViewDataSource {     _reloading = YES; } //完成加載時調(diào)用 -(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




正在學習過程中,錯誤之處請指正,歡迎交流,共同學習;


歡迎轉(zhuǎn)載分享,請注明出處http://blog.csdn.net/duxinfeng2010


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI