更輕量的View Controllers

View controllers 通常是 iOS 項(xiàng)目中最大的文件朝扼,并且它們包含了許多不必要的代碼。所以 View controllers 中的代碼幾乎總是復(fù)用率最低的澜驮。我們將會看到給 view controllers 瘦身的技術(shù)成黄,讓代碼變得可以復(fù)用匀油,以及把代碼移動到更合適的地方。

Data Source 分離出來

關(guān)于View Controllers的瘦身技術(shù)料饥,大家也知道一些技巧焕襟,例如把model、view層單獨(dú)分離出來肛搬,網(wǎng)絡(luò)請求不在controller中完成没佑。這篇文章介紹把 UITableViewDataSource 的代碼提取出來放到一個單獨(dú)的類中,是為 view controller 瘦身的強(qiáng)大技術(shù)之一温赔。提取出來的類可以在項(xiàng)目中復(fù)用蛤奢。

通常在項(xiàng)目中,會看到Data Source的以下三個代理方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.modelArray.count;
}

- (BankModel*)modelAtIndexPath:(NSIndexPath*)indexPath {
    return modelArray[(NSUInteger)indexPath.row];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    SelectedBankCardCell * cell = [tableView dequeueReusableCellWithIdentifier:selectedBankCardCellID forIndexPath:indexPath];
    SelectedBankCardModel *model = self.modelArray[indexPath.row];
    cell.model = model;
    if ([model.userBankId isEqualToString:_userBankId]) {
        cell.selectedButton.selected = YES;
        _selectedIndex = indexPath.row;
    }
    return cell;
}

這些代碼基本都是圍繞數(shù)組做一些事情陶贼,更針對地說啤贩,是圍繞 view controller 所管理的 modelArray 數(shù)組做一些事情。我們可以嘗試把數(shù)組相關(guān)的代碼移到單獨(dú)的類中拜秧。我們使用一個 block 來設(shè)置 cell瓜晤,也可以用 delegate 來做這件事,這取決于你的習(xí)慣腹纳。

代碼示例

新建一個類,.h文件如下:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

typedef void(^TableViewCellConfigureBlock)(id cell ,id item);

@interface YFYArrayDataSource : NSObject <UITableViewDataSource>

- (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier cellConfigureBlock:(TableViewCellConfigureBlock)aCellConfigureBlock;

- (id)itemAtIndexPath:(NSIndexPath *)indexPath;

@end

.m文件的實(shí)現(xiàn)

#import "YFYArrayDataSource.h"

@interface YFYArrayDataSource ()

@property (nonatomic,strong)NSArray *items;
@property (nonatomic,copy)NSString *cellIndentifier;
@property (nonatomic,copy)TableViewCellConfigureBlock cellConfigureBlock;

@end

@implementation YFYArrayDataSource

- (id)init{
    return nil;
}

- (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier cellConfigureBlock:(TableViewCellConfigureBlock)aCellConfigureBlock{
    
    self = [super init];
    if (self) {
        self.items = anItems;
        self.cellIndentifier = aCellIdentifier;
        self.cellConfigureBlock = [aCellConfigureBlock copy];
    }
    return self;
}

- (id)itemAtIndexPath:(NSIndexPath *)indexPath{
    return self.items[(NSInteger) indexPath.row];
}

#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.items.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIndentifier forIndexPath:indexPath];
    id item = [self itemAtIndexPath:indexPath];
    self.cellConfigureBlock(cell,item);
    return cell;
}

現(xiàn)在痢掠,你可以把 view controller 中的這 3 個方法去掉了驱犹,取而代之,你可以創(chuàng)建一個 ArrayDataSource 類的實(shí)例作為 table view 的 data source足画。

- (void)creatTabelView{
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, DBScreenWidth, DBScreenHeight - 64) style:UITableViewStylePlain];
    _tableView.delegate = self;
    [self.view addSubview:_tableView];
    
    TableViewCellConfigureBlock configureCell = ^(MessageTableViewCell *cell,MessageModel *model){
        cell.model = model;
    };
    self.dataSource = [[YFYArrayDataSource alloc] initWithItems:_modelArray cellIdentifier:@"MessageTableViewCell" cellConfigureBlock:configureCell];
    self.tableView.dataSource = self.dataSource;
    
    [_tableView registerNib:[UINib nibWithNibName:@"MessageTableViewCell" bundle:nil] forCellReuseIdentifier:@"MessageTableViewCell"];
     
}

現(xiàn)在你不用擔(dān)心把一個 index path 映射到數(shù)組中的位置了雄驹,每次你想把這個數(shù)組顯示到一個 table view 中時(shí),你都可以復(fù)用這些代碼淹辞。你也可以實(shí)現(xiàn)一些額外的方法医舆,比如 tableView:commitEditingStyle:forRowAtIndexPath:,在 table view controllers 之間共享象缀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬将,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子央星,更是在濱河造成了極大的恐慌霞怀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉给,死亡現(xiàn)場離奇詭異毙石,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颓遏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門徐矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叁幢,你說我怎么就攤上這事滤灯。” “怎么了曼玩?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵鳞骤,是天一觀的道長。 經(jīng)常有香客問我演训,道長弟孟,這世上最難降的妖魔是什么贝咙? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任样悟,我火速辦了婚禮,結(jié)果婚禮上庭猩,老公的妹妹穿的比我還像新娘窟她。我一直安慰自己,他們只是感情好蔼水,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布震糖。 她就那樣靜靜地躺著,像睡著了一般趴腋。 火紅的嫁衣襯著肌膚如雪吊说。 梳的紋絲不亂的頭發(fā)上论咏,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音颁井,去河邊找鬼厅贪。 笑死,一個胖子當(dāng)著我的面吹牛雅宾,可吹牛的內(nèi)容都是我干的养涮。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼眉抬,長吁一口氣:“原來是場噩夢啊……” “哼贯吓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜀变,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤悄谐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昏苏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尊沸,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年贤惯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洼专。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡孵构,死狀恐怖屁商,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颈墅,我是刑警寧澤蜡镶,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站恤筛,受9級特大地震影響官还,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毒坛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一望伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煎殷,春花似錦屯伞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弓乙,卻和暖如春末融,著一層夾襖步出監(jiān)牢的瞬間钧惧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工勾习, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垢乙,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓语卤,卻偏偏與公主長得像追逮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粹舵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容