使用 SSDataSources 給 Controller 減負

要說 iOS 開發中有什麼是最離不開的組件,我想是 UITableViewController。幾乎每一個iPhone 應用都會有它的身影,用了它,,不用考慮內容過多的問題,,熟悉自定義 UITableViewCell 以後,用起來幾乎和 UITableViewController 沒啥差。git

基本上,我認爲全部能用 UITableViewController 實現的頁面都該是UITableViewController,使用它的好處有:github

  • 自帶 ScrollView,不用考慮內容過多顯示不全、尺寸差別等問題
  • 使用 DataSource 返回數據,使用 Delegate 設置 Cell 的屬性

而後在使用在使用這些好處的時候,很容易就會發生 Controller 承載太多的功能:瀏覽器

  • DataSource、Delegate 的實現
  • 建立 Cell 在 Controller
  • 佈局 Cell 代碼
  • 獲取 Cell 須要的數據
  • 網絡請求

……簡直包山包海。網絡

而後就有了 整潔的 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 都能作什麼呢?它由如下部分組成:

  • SSArrayDataSource:基本的 DataSource,初始化的時候設置一波元素,沒有Section,不能展開
  • SSExpandingDataSource:頁面元素能夠展開
  • SSSectionedDataSource:頁面元素具備分組樣式

無論哪種類型,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

效果圖:

clipboard.png

什麼?心動了?趕快打開瀏覽器去看看吧:https://github.com/splinesoft/SSDataSources

相關文章
相關標籤/搜索