一行代码,快速为UITableView创建Delegate和DataSource

只需一行代码,快速为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

时间: 2024-08-10 19:24:31

一行代码,快速为UITableView创建Delegate和DataSource的相关文章

Core Graphics快速入门——从一行代码说起

Core Graphics入门 想必每个第一次接触Core Graphics的开发者都被无数的API.混乱的代码逻辑折腾得头疼不已,甚至望而却步.即使是绘制一个简单的矩形也看上去非常繁琐.本文换一个角度,整理一下有关Core Graphics的知识,也算作是这段时间学习的总结. Core Graphics和UIKit的区别 首先从概念上了解一下: 根据苹果的描述,UIKit是我们最容易也是最常接触到的框架.绝大多数图形界面都由UIKit完成.但是UIKit依赖于Core Graphics框架,也

不写一行代码创建Fiori App

2017-08-14 Alex Fiori 我在上文中介绍了SAP Web IDE, 今天就基于SAP Web IDE的强大特性,不写一行代码的建立一个Fiori App. 当然,不写一行代码创建的App在实际项目中还是未免过于幼稚,但是通过标准模板可以大体搭建一个App的基本框架,为后来的开发开来非常大的便利.通过这个过程大家对Fiori的基本技术UI5,MVC的体系结构也有一个大体的认识. 我们今天创建一个Fiori App,来显示财务凭证的头信息,这个App和我之前一直作为例子的Manag

快速开发框架(FDMS)新增1000个对外接口都不须要手写一行代码

一个大型系统难免会跟其它系统有数据交换,这里就要提供数据接口给外部系统. 曾经在一家智能终端设备的公司上班.那段时间的主要工作就是写接口.接口须要与手机.手持设备.系统管理软件等进行数据交换.总结了一下大部分时间都在做重复的工作. 于是我想到可不可以做出一个接口模型来,具体的数据交换怎么实现由用户来定义,那样的话就算要加1000个接口我都不用写一行代码. 看一下下面的图片 一般的操作直接选择普通操作类型即可. 复杂一点的操作可以选择存储过程来处理. 定义完接口以后,调用接口的时候可以按XML,J

一行代码,让你的应用中UIScrollView的滑动与侧滑返回并存

一行代码,让你的应用中UIScrollView的滑动与侧滑返回并存 侧滑返回是iOS系统的一个很贴心的功能,特别是在大屏手机上,单手操作的时候去按左上角的返回键特别不方便.当我在使用一个APP的时候,如果控制器不能侧滑返回,我会觉得这个APP十分不友好...这款产品在我心中的印象分也会有所降低...侧滑返回本身是系统自带的效果,无须开发者处理的.但是,一旦给控制器加了leftBarButtonItem,系统侧滑手势居然失效了(苹果你这样真的好吗...),要重新支持侧滑返回,可以做以下处理: 一.

几句代码快速集成自定义转场效果+ 全手势驱动

写在前面 在简书写完第一篇的自定义转场文章后,已经很久没有碰过转场了,毕竟在公司,功能实现才是最重要的,这些转场的动效,只能是点睛之笔,不太容易被重视,不过我的第一篇文章还是很多人的喜欢和讨论,很多人还提出些建议,非常感谢大家,这是我第一篇文章的地址自定义转场动画,里面包含了一些转场的基础知识,这篇文章我就不再讨论这些基础知识了. 为什么会有这第二篇文章,主要原因有如下几点: 1.能不能更简单?当我很久没有使用转场的时候,再次来使用它,感觉还是比较烦琐,有一大堆记不住的长长的代理方法,都要去co

不写一行代码即可运行一个应用

软件工程的构件化道路发展到今天,已经具有成熟的技术.这就像今天的大厦建筑一样,使用预制的构件,就能建造万丈高楼.同样道理,使用Spring Boot开发框架,也可以支持这种构件化的功能,正像其官方网站所介绍的那样,你甚至可以不用写一行代码,就可运行一个应用:“Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.” (h

快速设置UITableView不同section对应于不同种类的cell

本文主要是为了写明如何在UITableView中,一个section对应于一种类型的cell,写起来不凌乱. 在不封装任何类的前提下提供如下源码: 请自行创建出3种类型的cell,创建好了就行,你需要创建出ModelOneCell,ModelTwoCell,ModelThreeCell,内容为空 // // RootViewController.m // Sections // // Copyright (c) 2014年 Y.X. All rights reserved. // #import

一行代码解决IE兼容性问题

在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html><html xmlns=http://www.w3.org/1999/xhtml xmlns:bd=http://www.baidu.com/2010/xbdml>;<head><meta http-equiv=Content-Type content="text/h

一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 http://www.jb51.net/css/383986.html

在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 复制代码 代码如下: <!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml xmlns:bd=http://www.baidu.com/2010/xbdml>; <head> <meta http-equiv=Content-Type conten