一行代碼,快速為UITableView創建Delegate和DataSource

来源:http://www.cnblogs.com/Code4/archive/2016/06/21/5603413.html
-Advertisement-
Play Games

只需一行代碼,快速為UITableView創建Delegate和DataSource。簡介CBTableViewDataSource是一個輕量級的用於快速創建UITableView的DataSource和Delegate的框架。它提供了一些方便的API,幫助用戶以一種快速和有邏輯的方式創建DataS ...


只需一行代碼,快速為UITableView創建Delegate和DataSource。


簡介
CBTableViewDataSource是一個輕量級的用於快速創建UITableView的DataSource和Delegate的框架。它提供了一些方便的API,幫助用戶以一種快速和有邏輯的方式創建DataSource和Delegate。

最偷懶的使用方式如下:
[_tableView cb_makeSectionWithData:self.viewModel.data andCellClass:[CustomCell class]];
[size=1.75em]

[Objective-C] 查看源文件 複製代碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 // Native vision   // define a enum to split section   typedef NS_ENUM(NSInteger, SectionNameDefine) {     SECTION_ONE,     SECTION_TWO,     SECTION_THREE,     SECTION_FOUR,     //...     COUNT_OF_STORE_SECTION };   // define identifier for section   #define IDENTIFIER_ONE  @"IDENTIFIER_ONE" #define IDENTIFIER_TWO  @"IDENTIFIER_TWO" #define IDENTIFIER_THREE  @"IDENTIFIER_THREE" #define IDENTIFIER_FOUR @"IDENTIFIER_FOUR" //...     // register cell class for section   [self.tableView registerClass:[OneCell class] forCellWithReuseIdentifier:IDENTIFIER_ONE]; [self.tableView registerClass:[TwoCell class] forCellWithReuseIdentifier:IDENTIFIER_TWO]; [self.tableView registerClass:[ThreeCell class] forCellWithReuseIdentifier:IDENTIFIER_THREE]; [self.tableView registerClass:[FourCell class] forCellWithReuseIdentifier:IDENTIFIER_FOUR];     // implementation datasource protocol   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {     return COUNT_OF_STORE_SECTION; }   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {     return ((NSArray*)self.data[section]).count; }   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     NSUInteger section = (NSUInteger) indexPath.section;     NSUInteger index = (NSUInteger) indexPath.row;     switch(section) {         case SECTION_ONE:         // to do something             return cell;         case SECTION_TWO:         // to do something             return cell;         case SECTION_THREE:         // to do something             return cell;               //...     }       return cell; } // ...


可以看到,步驟多而繁瑣,維護十分困難。 而使用CBTableViewDataSource後

[Objective-C] 查看源文件 複製代碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 [_tableView cb_makeDataSource:^(CBTableViewDataSourceMaker * make) {     // section one     [make makeSection:^(CBTableViewSectionMaker *section) {         section.cell([OneCell class])             .data(self.viewModel.oneDate)             .adapter(^(OneCell * cell,id data,NSUInteger index){                 [cell configure:data];             })             .autoHeight();     }];     // section two     [make makeSection:^(CBTableViewSectionMaker *section) {         section.cell([TwoCell class])             .data(self.viewModel.twoData)             .adapter(^(FeedCell * cell,id data,NSUInteger index){                 [cell configure:data];             })             .autoHeight();     }];       // ... so on    }];


代碼變得簡練而富有層次感,更加符合人類的思維方式。
用法安裝使用cocoapods下載

[Ruby] 查看源文件 複製代碼 ?
1 pod 'CBTableViewDataSource'

導入包

[Objective-C] 查看源文件 複製代碼 ?
1 #import <CBTableViewDataSource/CBTableViewDataSource.h>

創建DataSource和Delegate

[Objective-C] 查看源文件 複製代碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 [_tableView cb_makeDataSource:^(CBTableViewDataSourceMaker * make) {     // section one     [make makeSection:^(CBTableViewSectionMaker *section) {         section.cell([OneCell class])             .data(self.viewModel.oneDate)             .adapter(^(OneCell * cell,id data,NSUInteger index){                 [cell configure:data];             })             .autoHeight();     }];     // section two     [make makeSection:^(CBTableViewSectionMaker *section) {         section.cell([TwoCell class])             .data(self.viewModel.twoData)             .adapter(^(FeedCell * cell,id data,NSUInteger index){                 [cell configure:data];             })             .autoHeight();     }];       // ... so on    }];

例子僅使用Data

[Objective-C] 查看源文件 複製代碼 ?
1 _data = @[    @{[color=#183691]@"text"[/color]:[color=#183691]@"Following"[/color],[color=#183691]@"value"[/color]:[color=#183691]@"45"[/color]},    @{[color=#183691]@"text"[/color]:[color=#183691]@"Follower"[/color],[color=#183691]@"value"[/color]:[color=#183691]@"10"[/color]},    @{[color=#183691]@"text"[/color]:[color=#183691]@"Star"[/color],[color=#183691]@"value"[/color]:[color=#183691]@"234"[/color]},    @{[color=#183691]@"text"[/color]:[color=#183691]@"Setting"[/color],[color=#183691]@"accessoryType"[/color]:@(UITableViewCellAccessoryDisclosureIndicator)},    @{[color=#183691]@"text"[/color]:[color=#183691]@"Share"[/color],[color=#183691]@"accessoryType"[/color]:@(UITableViewCellAccessoryDisclosureIndicator)}];


則顯示樣式如下:

 


具體詳情請下載該項目,查看DemoTwoViewController.h和DemoTwoViewController.m.
使用自定義Cell

[Objective-C] 查看源文件 複製代碼 ?
1 [size=13.6px]- ([color=#a71d5d]void[/color])configure:([color=#086b3]NSDictionary[/color] *)row index:([color=#086b3]NSNumber[/color] * )index {    [color=#a71d5d]if[/color] (row[[color=#183691]@"avatar"[/color]]) {        [[color=#ed6a43]self[/color].avatarView [color=#086b3]setImage:[/color][UIImage [color=#086b3]imageNamed:[/color]row[[color=#183691]@"avatar"[/color]]]];    } [color=#a71d5d]else[/color] {        [[color=#ed6a43]self[/color].avatarView [color=#086b3]setImage:[/color][color=#086b3]nil[/color]];    }    [[color=#ed6a43]self[/color].nameLabel [color=#086b3]setText:[/color]row[[color=#183691]@"name"[/color]]];    [[color=#ed6a43]self[/color].titleLabel [color=#086b3]setText:[/color]row[[color=#183691]@"title"[/color]]];    [[color=#ed6a43]self[/color].detailLabel [color=#086b3]setText:[/color]row[[color=#183691]@"detail"[/color]]];    self.[color=#333333]circleView[/color].[color=#333333]hidden[/color] = row[[color=#183691]@"unread"[/color]] == [color=#086b3]nil[/color];    [color=#a71d5d]if[/color]([[color=#086b3]index[/color] [color=#086b3]intValue[/color]] &[color=#086b3]1[/color]) {        self.[color=#333333]contentView[/color].[color=#333333]backgroundColor[/color] = [UIColor [color=#086b3]colorWithRed:[/color][color=#086b3]0.95[/color] [color=#086b3]green:[/color][color=#086b3]0.96[/color] [color=#086b3]blue:[/color][color=#086b3]0.96[/color] [color=#086b3]alpha:[/color][color=#086b3]1.00[/color]];    } [color=#a71d5d]else[/color] {        self.[color=#333333]contentView[/color].[color=#333333]backgroundColor[/color] = [UIColor [color=#086b3]whiteColor[/color]];    }}




具體用法請查看項目中CustomCell.h和CustomCell.m文件 頁面樣式如下:

 


詳情請查看項目中DemoOneViewController.h和DemoOneViewController.m文件。
更靈活的設置

[Objective-C] 查看源文件 複製代碼 ?
1 2 3 4 5 [tableView [color=#086b3]cb_makeSection:[/color]^(CBTableViewSectionMaker * section) {    section.[color=#086b3]data[/color](@[]);    section.[color=#086b3]cell[/color]([CustomCell [color=#086b3]class[/color]]);    section.[color=#086b3]adapter[/color](^(CustomCell cell,[color=#a71d5d]id[/color] row,[color=#a71d5d]NSUInteger[/color] [color=#086b3]index[/color]) {        cell.[color=#086b3]configure[/color](row);    });    section.[color=#086b3]event[/color](^() {        [color=#969896]// do something[/color]    })    [color=#969896]// other setting[/color]}];[mw_shl_code] 這裡展示的是單個section的情況。[b]CBTableViewSectionMaker對象支持設置以下屬性:[/b]註意,這些設置都是針對單獨的section設置的 [b]data[/b]設置UITableView所要展示的數據。參數是一個NSArray。 如下:   [mw_shl_code=objc,true]section.data(@[@(goods1),@(goods2),...]);


cell設置UITableView展示數據用的Cell Class。該Class會自動註冊identifier,無需手動註冊
如:

[Objective-C] 查看源文件 複製代碼 ?
1 section.cell([CustomCell [color=#086b3]class[/color]]);


adapter用於適配Cell和Data,如:

[Objective-C] 查看源文件 複製代碼 ?
1 section.adapter(^(CustomCell * cell,id row,NSUInteger index) {    [cell configure:row];    // ...});


event設置點擊cell的響應事件。如:

[Objective-C] 查看源文件 複製代碼 ?
1 section.event(^([color=#a71d5d]NSUInteger[/color] index,[color=#a71d5d]id[/color] row) {    CustomViewController * controller = [CustomViewController [color=#086b3]new[/color]];    controller.[color=#333333]viewModel[/color].[color=#333333]data[/color] = row;    [[color=#ed6a43]self[/color].navigationController [color=#086b3]pushViewController:[/color]controller [color=#086b3]animated:[/color][color=#086b3]YES[/color]];});


height用於設置cell的高度。傳一個固定的值。該高度只對該section有效。如:

[Objective-C] 查看源文件 複製代碼 ?
1 section.height([color=#086b3]100[/color]);


autoHeight設置自動動態計算cell高度。用於cell高度不一的場景。

[Objective-C] 查看源文件 複製代碼 ?
1 section.autoHeight();


該屬性與height衝突,優先順序是autoHeight > height。 也就是說當設置了autoHeight,則height失效,高度以autoHeight為準
headerTitle;設置section的headerTitle。用法如:

[Objective-C] 查看源文件 複製代碼 ?
1 2 3 4 5 section.headerTitle([color=#183691]"title"[/color]);[mw_shl_code] [b]footerTitle;[/b]設置section的footerTitle。用法同上。 [b]headerView;[/b]設置section的Header View。用法如下:   [mw_shl_code=objc,true]section.headerView(^(){    UIView * headerView = [UIView [color=#086b3]alloc[/color]]initWithFrame:[color=#086b3]CGRectMake[/color]([color=#086b3]0[/color],[color=#086b3]0[/color],[color=#086b3]320[/color],[color=#086b3]40[/color]);    [color=#969896]// ...[/color]    [color=#a71d5d]return[/color] headerView;})


該屬性與headerTitle衝突,當設置了headerView,以headerView為準。footerView;設置section的Footer View。用法同上 該屬性與footerTitle衝突,當設置了footerView,以footerView為準。
多個section的情況

[Objective-C] 查看源文件 複製代碼 ?
1 [tableView [color=#086b3]cb_makeDataSource:[/color]^(CBTableViewDataSourceMaker * make) {    [make [color=#086b3]headerView:[/color]^{        [color=#a71d5d]return[/color] [HeaderView [color=#086b3]new[/color]];    }];    [make [color=#086b3]makeSection:[/color] ^(CBTableViewSectionMaker * section) {        section.[color=#086b3]data[/color](@[]);        section.[color=#086b3]cell[/color]();        section.[color=#086b3]adapter[/color]();        section.[color=#086b3]event[/color]();        [color=#969896]// ... so on[/color]    }];    [make [color=#086b3]makeSection:[/color] ^(CBTableViewSectionMaker * section) {        section.[color=#086b3]data[/color](@[]);        section.[color=#086b3]cell[/color]();        section.[color=#086b3]adapter[/color]();        section.[color=#086b3]event[/color]();        [color=#969896]// ... so on[/color]    }];    [make [color=#086b3]makeSection:[/color] ^(CBTableViewSectionMaker * section) {        section.[color=#086b3]data[/color](@[]);        section.[color=#086b3]cell[/color]();        section.[color=#086b3]adapter[/color]();        section.[color=#086b3]event[/color]();        [color=#969896]// ... so on[/color]    }];    [color=#969896]// .. so on[/color]    [make [color=#086b3]footView:[/color]^{        [color=#a71d5d]return[/color] [FooterView [color=#086b3]new[/color]];    }];}]


頁面樣式如下:

 

 

具體的代碼請查看項目中DemoThreeViewController.h和DemoThreeViewController.m文件。CBTableViewDataSourceMaker支持設置以下屬性:註意這些屬性都是針對整個UITableView
makeSection用於為UITableView添加一個section。用法如下:

[Objective-C] 查看源文件 複製代碼 ?
1 [tableView [color=#086b3]cb_makeDataSource:[/color]^(CBTableViewDataSourceMaker * make) {    [make [color=#086b3]makeSection:[/color] ^(CBTableViewSectionMaker * section) {       [color=#969896]// ...[/color]    }}]


height為整個UITableView的Cell設置預設高度。用法如下:

[Objective-C] 查看源文件 複製代碼 ?
1 make.height([color=#086b3]100[/color]);


該屬性與CBTableViewSectionMaker設置的height和autoHeight衝突。優先順序是autoHeight > height(section) > height(UITableView)
也就是說,當一個section設置了autoHeight,則以autoHeight為準,其他section未設置autoHeight,而設置了height(section),則以height(section)為準,如果兩者都沒有,則以height(UITableView)為準。height預設為40。
headerView設置UITableView的tableHeaderView,註意與section的headerView的區別,一個UITableView只有一個tableHeaderView。用法如下:

[Objective-C] 查看源文件 複製代碼 ?
1 make.headerView(^(){    UIView * headerView = [[UIView [color=#086b3]alloc[/color]]init];    [color=#969896]// ...[/color]    [color=#a71d5d]return[/color] headerView;});


footerView設置UITableView的tableFooterView,同上。
commitEditing設置UITableView的commitEditing代理方法,設置了該方法,則cell側滑可以出現刪除按鈕。 可以在剛方法設置當cell處於編輯狀態需要處理的事件。用法如下:

[Objective-C] 查看源文件 複製代碼 ?
1 [make [color=#086b3]commitEditing:[/color]^(UITableView * tableView, UITableViewCellEditingStyle * editingStyle, [color=#086b3]NSIndexPath[/color] * indexPath) {    [color=#969896]// do somethings.                [/color]}];


scrollViewDidScroll設置UITableView的scrollViewDidScroll代理方法,當UITableView滾動時會調用該方法。 可以使用該方法處理UITableView的滾動事件。

[Objective-C] 查看源文件 複製代碼 ?
1 [make [color=#086b3]scrollViewDidScroll:[/color]^(UIScrollView * scrollView) {    [color=#969896]// do somethings                [/color]}];

鳴謝感謝您的使用和支持。歡迎issue和pull request,我會在第一時間內處理。
在這個框架中,我參考了許多大神們設計的框架。比如API的設計就參考了著名的AutoLayout框架Masonry。而在動態計算cell的高度上,則參考了@forkingdog的UITableView-FDTemplateLayoutCell的做法。

感謝他們帶給我的靈感。

 

 

代碼下載:

http://www.code4app.com/thread-8859-1-1.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前學習swift時的個人筆記,根據github: "the swift programming language in chinese" 學習、總結,將重要的內容提取,加以理解後整理為學習筆記,方便以後查詢用。詳細可以參考 "the swift programming language in ch ...
  • 本篇涉及例子下載:Github 本篇講android 3.0引入的屬性動畫框架,上篇寫視圖動畫View Animation時就說過ViewAnimation的缺點,那就是動畫作用的是view本身的視覺部分,view實際屬性並沒有隨著動畫的改變而變化。很多時候就需要額外去出來由於動畫引起的事件不同步, ...
  • 安卓廣播分為兩類:1.普通廣播, broadcast,廣播發出之後所有滿足條件的應用都能獲取到廣播裡面的數據,缺點是應用獲取廣播中的數據修改之後不能傳遞給其它接收廣播的應用;2.有序廣播,orderbroadcast,廣播發出之後各應用根據應用的優先順序依次接收廣播,優先順序高的應用接收廣播之後修改的數 ...
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 最近學到解析JSON格式的網路數據,而作業也要求自己找一個天氣預報的API地址,然後解析其中JSON格式的數據。可能是因為找的是免費的API地址,在百度APIStore里的,它那JSON返回示例的數據,跟我獲取之後 ...
  • iOS9全新的聯繫人相關框架——Contacts Framework 一、引言 在以前iOS開發中,涉及聯繫人相關的編程,代碼都非常繁瑣,並且框架的設計也不是Objective-C風格的,這使開發者用起來非常的難受。在iOS9中,apple終於解決了這個問題,全新的Contacts Framewor ...
  • 首先需要理清楚流程: 雖然看起來有點多,但是理解起來並不複雜,跟我們平時手機上買東西是一樣的。我們客戶端需要做的就是 調起微信客戶端發起支付 顯示支付結果 集成過程 微信SDK下載 微信SDK下載 建議頭文件和示例都下載出來看看。(吐槽下,官方的示例難看死了,看的眼暈!註釋都沒幾個。。。鄙視之) 導 ...
  • 從這一篇開始,我會把iOS 7.0 到最新版本的更新摘要都整理出來,時間跨度可能會很久。這是每一個 iOS SDK(Release Version)發佈時,同步發佈的 “What's New in iOS x.x” 的摘要(說摘要可能更好一點,畢竟我有許多不熟悉的模塊,說翻譯要被打腫臉的。。。)。 ...
  • <GridView android:id="@+id/movie_list" android:layout_width="906dp" android:layout_height="654dp" android:layout_marginLeft="230dp" android:layout_mar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...