要說 iOS 開發中有什麼是最離不開的組件,我想是 UITableViewController。幾乎每一個iPhone 應用都會有它的身影,用了它,,不用考慮內容過多的問題,,熟悉自定義 UITableViewCell 以後,用起來幾乎和 UITableViewController 沒啥差。git
基本上,我認爲全部能用 UITableViewController 實現的頁面都該是UITableViewController,使用它的好處有:github
而後在使用在使用這些好處的時候,很容易就會發生 Controller 承載太多的功能:瀏覽器
……簡直包山包海。網絡
而後就有了 整潔的 Table View 代碼、更輕量的ViewControllers 這種最佳實踐文章。佈局
這篇文章的觀點是把 DataSource 分離出來,獨立成一個類,而後將 tableView 的 dataSource 屬性指給其實例,如:ui
- (void)viewDidLoad { self.tableView.dataSource = [[MenuDataSouirce alloc] initWithItems:@[@"用戶", @"問題", @"文章", @"標籤", @"登陸"]]; .... }
接下來就是在 dataSource 中建立Cell、設置樣式、填充數據,在 Controller 中實現了 delegate,一切彷彿都變的好了簡潔了又能夠愛下去了。atom
隨着項目的進行,會發現有不少「無趣」的頁面都要作重複的工做,如側邊欄、用戶設置、用戶登陸頁這種,每次都要去實現一遍 dataSource 裏面的這些方法:spa
tableView:cellForRowAtIndexPath: tableView:numberOfRowsInSection: tableView:numberOfSection:
WTF!!你發現這些堆代碼的工做消耗了不少時間,而這些無聊工做應該更快更好的完成。code
若是你遇到相同的苦惱,SSDataSources 或許能把你解救出來。blog
無論哪種類型,SSDataSources 都支持動態增長元素、刪除元素。此外它也同時適用於 UICollectionView。還有一些對 FooterView、HeaderView 的冗餘屬性,總之讓你和 tableView 打交道的時候更舒心。
下面貼一下使用 SSDataSource 實現的側邊欄(代碼還不到 50 行):
#import "MenuController.h" #import "SSArrayDataSource.h" #define TOP_CELL_HEIGHT 64.0f @interface MenuController () @property (nonatomic, strong) SSArrayDataSource *dataSource; @property (nonatomic, strong) NSArray *items; @end @implementation MenuController { } - (void)viewDidLoad { [super viewDidLoad]; self.items = @[ @"用戶", @"問題", @"文章", @"標籤", @"", @"登陸"]; self.dataSource = (id)[[SSArrayDataSource alloc] initWithItems:self.items]; [self.dataSource setCellConfigureBlock:^(UITableViewCell *cell, NSString *s, id parentView, NSIndexPath *indexPath) { cell.textLabel.text = s; }]; self.tableView.dataSource = self.dataSource; } - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGFloat result = 44; if(indexPath.row == 0) { result = TOP_CELL_HEIGHT; } else if([self.items[(NSUInteger) indexPath.row] isEqualToString:@""]) { CGFloat screen_height = self.view.bounds.size.height; CGFloat other_hight_sum = TOP_CELL_HEIGHT + (self.items.count-2) * 44.f; result = MAX(screen_height - other_hight_sum, 0.f); } return result; } @end
效果圖:
什麼?心動了?趕快打開瀏覽器去看看吧:https://github.com/splinesoft/SSDataSources