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