只需一行代码,通过链式风格快速配置UITableView包括创建Del...

[复制链接]
来自: hongdong 分类: iOS精品源码 上传时间: 2017-11-17 11:32:22
Tag:

项目介绍:

HDTableViewMaker 中文文档

github:https://github.com/hongdong/HDTableViewMaker

只需一行代码,快速配置UITableView的一切东西(最终目标),包括创建DelegateDataSource、集成刷新等功能。

简介

HDTableViewMaker是一个轻量级的用于快速配置UITableView的框架。它提供了一些方便的API,帮助用户以一种快速和逻辑集中的方式配置出你想要的UITableView。

为什么使用

我们在开发App的时候,往往花费大量的时间在为UITableViewDataSourceDelegate上。而它们往往是一些重复性的并且难以维护的代码。因为它们分散在了各个代理方法中,当我们需要进行修改时,需要到各个代理方法中依次修改它们。

HDTableViewMaker改变了这种书写方式,它提供一套简练的API,使得我们可以快速地书写有逻辑的,更集中的,更便于维护的代码。

为了让大家看到使用该框架的优势,我们来做一个对比:

使用原生方式创建DataSourceDelegate:


// 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;

}

// ...

可以看到,步骤多而繁琐,最让我受不了的是这种逻辑的分离,特别是在MVVM中严重影响了代码的內聚而且维护起来十分困难。

而使用HDTableViewMaker


    [[_mainTable hd_tableViewMaker:^(HDTableViewMaker *tableViewMaker) {

        tableViewMaker.hd_sectionCount(1).hd_sectionMaker(^(HDSectionMaker * sectionMaker){

            sectionMaker.hd_dataArr(^(){

                return self.dataArr;

            }).hd_cellMaker(^(HDCellMaker *cellMaker){

                cellMaker.hd_cellClass([HDTableViewCell class]).hd_adapter(^(HDTableViewCell *cell,id data,NSIndexPath *indexPath){

                    cell.title = data;

                }).hd_autoHeight();

            });

        });

    }] hd_addAllFresh:^(HDFreshType freshType) {

    }];

可以看到代码变得简练而富有层次感了,更加符合人类的思维方式。而且这些配置都支持无序配置的,不管你先设置什么后设置什么,最后的效果都是一样的,所以想怎么设置就怎么设置吧。

关于框架后续以及框架性能

写这个框架的初衷是想把UITableView这个在IOS开发中用的最多也是最难搞的东西给简化起来、通过三言两语的配置就能展示出自己想要的效果,并且整合一些在UITableView上面的一些常用的功能,接下来会打算实现全屏的loading以及emptyset。

框架实现是封装存储了配置时候设置的属性、等到一定的时机读取这些配置而已、所以性能上只能多存储了一些变量罢了。

用法

安装

使用cocoapods下载


pod 'HDTableViewMaker'

导入包


#import <HDTableViewMaker/HDTableViewMakerHeader.h>

创建DataSourceDelegate并添加刷新控件


       [[_mainTable hd_tableViewMaker:^(HDTableViewMaker *tableViewMaker) {

        tableViewMaker.hd_sectionCount(1).hd_sectionMaker(^(HDSectionMaker * sectionMaker){

            sectionMaker.hd_dataArr(^(){

                return self.dataArr;

            }).hd_cellMaker(^(HDCellMaker *cellMaker){

                cellMaker.hd_cellClass([HDTableViewCell class]).hd_adapter(^(HDTableViewCell *cell,id data,NSIndexPath *indexPath){

                    cell.title = data;

                }).hd_autoHeight();

            });

        });

    }] hd_addAllFresh:^(HDFreshType freshType) {

    }];

HDTableViewMaker支持设置以下属性:

注意这些属性都是针对整个UITableView

hd_sectionCount

用户配置这个tableView中存在几个的section


  dataSourceMaker.hd_sectionCount(10)
hd_sectionMaker

用于为UITableView配置每一个section。用法如下:


    [_mainTable hd_tableViewMaker:^(HDTableViewMaker *tableViewMaker) {

        tableViewMaker

        .hd_sectionMaker(^(HDSectionMaker * sectionMaker){

            //...

        });

    }];
hd_height

为整个UITableView的Cell设置默认高度。用法如下:


tableViewMaker.hd_height(100);

该属性与HDSectionMaker和HDCellMaker设置的hd_height和hd_autoHeight冲突。优先级是autoHeight(cell) >height(cell) > height(section) > height(UITableView)

也就是说,当一个cell设置了autoHeight,则以autoHeight为准,其他cell未设置autoHeight,而设置了height(cell),则以height(cell)为准,如果两者都没有,则以height(section)为准。类推。height默认为40。

hd_headerView

设置UITableView的tableHeaderView,注意与section的headerView的区别,一个UITableView只有一个tableHeaderView。用法如下:


make.hd_headerView(^(){

    UIView * headerView = [[UIView alloc]init];

    // ...

    return headerView;

});
footerView

设置UITableView的tableFooterView,同上。

hd_commitEditing

设置UITableView的commitEditing代理方法,设置了该方法,则cell侧滑可以出现删除按钮。

可以在刚方法设置当cell处于编辑状态需要处理的事件。用法如下:


 [make commitEditing:^(UITableView * tableView, UITableViewCellEditingStyle * editingStyle, NSIndexPath * indexPath) {

    // do somethings.                

}];
hd_scrollViewDidScroll

设置UITableView的scrollViewDidScroll代理方法,当UITableView滚动时会调用该方法。

可以使用该方法处理UITableView的滚动事件。


[make scrollViewDidScroll:^(UIScrollView * scrollView) {

    // do somethings                

}];

HDSectionMaker对象支持设置以下属性:

注意,这些设置都是针对单独的section设置的

hd_dataArr 

设置这个section中所要展示的数据。参数是一个返回NSArray。

这样在外界的dataArr发生变化以后调用reload就可能刷新整个UITableView了。

如下:


sectionMaker.hd_dataArr(^(){

                return self.dataArr;

            }).
hd_headerTitle;

设置section的headerTitle。用法如:


section.hd_headerTitle("title");
hd_footerTitle;

设置section的footerTitle。用法同上。

hd_headerView;

设置section的Header View。用法如下:


section.hd_headerView(^(){

    UIView * headerView = [UIView alloc]initWithFrame:CGRectMake(0,0,320,40);

    // ...

    return headerView;

})

该属性与headerTitle冲突,当设置了headerView,以headerView为准。

hd_footerView;

设置section的Footer View。用法同上

该属性与footerTitle冲突,当设置了footerView,以footerView为准。

HDCellMaker对象支持设置以下属性:

注意,这些设置都是针对单独的cell设置的

hd_cellClass

设置UITableView展示数据用的Cell Class。该Class会自动注册identifier(XIB),无需手动注册

如:


make.hd_cellClass([CustomCell class]);
hd_adapter

用于适配CellData,做过安卓的应该很熟悉这个词。如:


cell.hd_adapter(^(CustomCell * cell,id data,NSIndexPath *indexPath) {

    [cell configure:data];

    // ...

});
hd_event

设置点击cell的响应事件。如:


make.hd_event(^(NSIndexPath *indexPath,id data) {

    CustomViewController * controller = [CustomViewController new];

    controller.viewModel.data = data;

    [self.navigationController pushViewController:controller animated:YES];

});
hd_height

用于设置cell的高度。传一个固定的值。该高度只对该cell有效。如:


make.hd_height(100);
hd_autoHeight

设置自动动态计算cell高度。用于cell高度不一的场景。


make.hd_autoHeight();

该属性与height冲突,优先级是autoHeight > height。

也就是说当设置了autoHeight,则height失效,高度以autoHeight为准

关于上拉下拉刷新的配置

hd_addFreshHeader

添加头部刷新

hd_addFreshFooter

添加上拉加载更多

hd_addAllFresh

全部添加

hd_endFreshing

结束刷新、注意的是参数existMoreData,如果是YES,则可以上拉加载更多,如果是NO则上拉加载更多会自动变成已经加载全部数据。在数据源为空时会自动隐藏加载更多控件

鸣谢

感谢您的使用和支持。欢迎issue和pull request,我会在第一时间内处理。

在这个框架中,我参考了许多大神们设计的框架。比如API的设计就参考了著名的AutoLayout框架Masonry。而在动态计算cell的高度上,则使用了@forkingdog的UITableView-FDTemplateLayoutCell大法。刷新控件使用了大家都在用的MJRefresh。

感谢他们带给我的灵感。

如有任何问题需要第一时间得到回答,请加QQ:9395220。

相关源码推荐:

我来说两句
所有评论(18)
逆鳞九霄 2017-11-17 18:24:03
我只是路过打酱油的。
回复
逆鳞九霄 2017-11-17 18:24:46
强烈支持楼主ing……
回复
kengsir 2017-11-17 18:24:57
code4app好的内容真的很多~赞
回复
phoiu 2017-11-17 18:25:30
感谢大神~
回复
hellokenken 2017-11-17 18:25:36
内容很好,棒棒哒
回复
AlonMessi 2017-11-17 18:25:47
不错不错,楼主辛苦了。。。
回复
littleRed 2017-11-17 18:27:02
好好 学习了 确实不错
回复
BlueManlove 2017-11-17 18:27:09
膜拜大神~
回复
任先生的小栗子 2017-11-20 08:37:02
很给力,Code4App有你更精彩!
回复
12下一页
提取码:  下载次数:40 状态:已购或VIP 售价:0(原价:20)金钱 下载权限:初级码农 
2135 0 40
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )