編寫整潔的TableView代碼--基于Block的TableView/CollectionView數(shù)據(jù)源封裝

? ? iOS界面開發(fā)中,每個控制器中重復度最高的代碼砰识,可能就是 TableView 的相關方法了慎菲。

- (NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section;

-?(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath;

-?(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath;

? ? 上面的代碼在項目中大量出現(xiàn)辩诞,Table View 通過這些數(shù)據(jù)源方法和代理方法與 view controllers 之間傳遞信息,而幾乎所有的任務都在 view controller 中進行酒朵。為了避免讓 view controllers 做所有的事桦锄,我們可以將所有的這些繁瑣的任務,交給一個專門的類來處理蔫耽,view controllers 只需在 viewDidLoad: 中告訴這個類要做什么结耀。基于這個思路,我對 Table View / Collection View 的數(shù)據(jù)源和代理方法進行了封裝图甜。

? ? 在MVC模式下碍粥,每個 Cell 應該有一個對應的 Model 來處理數(shù)據(jù)業(yè)務,在初始化 WFDataSource 時黑毅,需要傳入Model與Cell的對應關系嚼摩。通過block回調,將 cell 與 model 對應起來矿瘦。

NSDictionary*modelCellMap = @{@"DemoCellModel":@"DemoCell",@"DemoCellModel_XIB":@"DemoCell_XIB",};

WFDataSource*dataSource = [[WFDataSourcealloc]initWithModelCellMap:modelCellMapcellConfigBlock:^(idcell,iditem,NSIndexPath*indexPath) {

[cellconfigCellWithItem:item];}

];

? ? 在日常開發(fā)中枕面,往往會出現(xiàn)使用XIB創(chuàng)建的Cell和純代碼Cell混用的情形,而兩者在通過 table view 的緩存池機制創(chuàng)建 cell 時的差異缚去,可以通過下面兩個方法進行統(tǒng)一膊畴。

- (void)registerNib:(nullableUINib*)nibforCellReuseIdentifier:(NSString*)identifier;

-?(void)registerClass:(nullable?Class)cellClassforCellReuseIdentifier:(NSString*)identifier;

? ? WFDataSource 對此進行了處理, 傳入的cell 支持任意方式創(chuàng)建,并可以混用病游。

? ? Table View 的其他數(shù)據(jù)源方法和代理方法,通過 block 的方式扁平化處理稠通。

dataSource.headerViewForSection= ^UIView*(idsectionItem, NSInteger section) {

? ? //create?headerView

? ? returnheaderView;

};

dataSource.didSelectCellBlock= ^(iditem,NSIndexPath*indexPath) {

};

dataSource.heightForRow= ^CGFloat (iditem,NSIndexPath*indexPath) {

? ? //height?for?different?cell

? ? returnheight;

};

? ? dataSource 創(chuàng)建后衬衬,需要將綁定的 table view 賦給它。

self.dataSource.tableView=self.tableView;

? ? 項目已經開源改橘,更多用法滋尉,可以參考項目Demo。 https://github.com/jwfstars/WFDataSource

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末飞主,一起剝皮案震驚了整個濱河市狮惜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碌识,老刑警劉巖碾篡,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筏餐,居然都是意外死亡开泽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門魁瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆律,“玉大人,你說我怎么就攤上這事导俘÷驮牛” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵旅薄,是天一觀的道長辅髓。 經常有香客問我,道長,這世上最難降的妖魔是什么利朵? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任律想,我火速辦了婚禮,結果婚禮上绍弟,老公的妹妹穿的比我還像新娘技即。我一直安慰自己,他們只是感情好樟遣,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布而叼。 她就那樣靜靜地躺著,像睡著了一般豹悬。 火紅的嫁衣襯著肌膚如雪葵陵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天瞻佛,我揣著相機與錄音脱篙,去河邊找鬼。 笑死伤柄,一個胖子當著我的面吹牛绊困,可吹牛的內容都是我干的。 我是一名探鬼主播适刀,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼秤朗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笔喉?” 一聲冷哼從身側響起取视,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎常挚,沒想到半個月后作谭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡奄毡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年丢早,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秧倾。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡怨酝,死狀恐怖,靈堂內的尸體忽然破棺而出那先,到底是詐尸還是另有隱情农猬,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布售淡,位于F島的核電站斤葱,受9級特大地震影響慷垮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜揍堕,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一料身、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衩茸,春花似錦芹血、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囊蓝,卻和暖如春饿悬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聚霜。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工狡恬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝎宇。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓傲宜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夫啊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容