AOZTableViewProvider
AOZTableViewProvider 允许您使用自己的配置文件构建 UITableView,无需编写任何 dataSource 和 delegate。
中文文档请访问 README_CN.md。
要求
- Xcode 7.0 或更高版本
- iOS 5.0 或更高版本
- 如果您的项目使用 MRC,请添加
-fobjc-arc
目标
安装
- 下载此项目
- 将以下文件添加到您的项目中
- AOZTableViewCell
- AOZTableViewConfigFileParser
- AOZTableViewDefaultConfigFileParser
- AOZTableViewDefaultConfigFileParserAddons
- AOZTableViewProvider
- AOZTableViewProviderUtils
安装完成。
##通过 CocoaPods 安装
现在 AOZTableViewProvider 在 CocoaPods 中可用,只需将以下行添加到您的 pod 文件中
pod 'AOZTableViewProvider', '~> 0.3'
快速入门
-
编写您自己的配置文件,例如,如下所示
row
-
在你的viewController.m文件中,导入AOZTableViewProvider.h,并编写以下代码
//_tableView: your own UITableView _tableViewProvider = [[AOZTableViewProvider alloc] init]; _tableViewProvider.configBundleFileName = /*Your config file*/; _tableViewProvider.dataProvider = self; [_tableViewProvider connectToTableView:mainTableView]; [_tableViewProvider parseConfigFile:NULL]; //[_tableViewProvider setNeedsReloadForMode:0];//called when data source for mode 0 is updated. [_tableViewProvider reloadTableView];
-
运行你的项目,你将看到只有一个行的_tableView。
关于配置文件
配置文件是带有.tableViewConfig扩展名的文本文件,并由多行组成。每一行可以以section,row或者mode开头。
行
表示一个单行,可以与-s, -c, -n和-all结合使用。
-s:数据源到行;
-c:行的单元格类;
-n:每行的元素数量,仅当-s为数组时可用;
-all:所有数组元素都在同一行中,仅当-s为数组时可用。
例如
//_array = @[@1, @2, @3, @4, @5]: I just write it here for convenience, this line doesn't belongs to the comfig file, you should write it in your code
row -s _array -c TableViewCell
表示数据源为_array且单元格类为TableViewCell的行,每行只有一个元素。
row -s _array -n 2 -c TableViewCell
表示数据源为_array且每行有两个元素的行。
row -s _array -all -c TableViewCell
表示数据源为_array 且所有元素都在同一行的行。
###关于TableViewCell
我们的配置文件中的TableViewCell是AOZTableViewCell的子类,或者是AOZTableViewCell的实现。
//TableViewCell.h
#import "AOZTableViewCell.h"
@interface TableViewCell : UITableViewCell <AOZTableViewCell>
@end
//TableViewCell.m
#import "TableViewCell.h"
@implementation TableViewCell
- (void)setContents:(id)contents {
if ([contents isKindOfClass:[NSString class]]) {
self.textLabel.text = (NSString *)contents;
} else if ([contents isKindOfClass:[NSArray class]]) {
NSMutableString *str = [NSMutableString string];
for (NSString *subStr in ((NSArray *) contents)) {
[str appendFormat:@"%@ ", subStr];
}
self.textLabel.text = str;
} else if ([contents isKindOfClass:[NSDictionary class]]) {
self.textLabel.text = contents[@"title"];
}
}
+ (CGFloat)heightForCell:(id)contents {
return 40;
}
@end
通常你应该重写setContents
和heightForCell
方法来告诉tableViewProvider如何确定高度,或者如何处理不同的内容。
在你的setContents:(id)contents
方法中,根据你的配置文件中的不同-all
或-n
参数,将发送不同的内容给你。
配置 | 内容 |
---|---|
row -s _array -c TableViewCell | 内容是你的数组中的元素 |
row -s _array -n 2 -c TableViewCell | 内容是最大包含2个元素的NSArray |
row -s _array -all -c TableViewCell | 内容是包含_array中所有元素的NSArray |
row -s _dictionary -c TableViewCell | 内容是具有与_dictionary相同键和值的NSDictionary |
节
表示一个单项,可以接受与行相同的参数。
例如
section -s _array -c TableViewCell
表示数据源为_array且每个节都有一个单元格类为TableViewCell的行的节。
section -c TableViewCell -h SectionHeaderView
表示具有SectionHeaderView作为头部视图的节,并且还包含一个单元格类为TableViewCell的行。
模式
在一次配置文件中,您可以编写多个不同的配置
mode
row -c TableViewCell
mode
row -c TableViewCell2
这意味着tableView有两种模式,您可以通过以下方式更改它们
_tableViewProvider.mode = 0;//or 1
[_tableViewProvider reloadDataAndTableView];
更复杂的行和分区
您可以在一个分区中写多个行,例如
section
row
row
这意味着一个分区和其中的两个行。
//_dictionary = @{@"first": @"1st value", @"second": @"2nd value"};
section -s _dictionary
row -s first
row -s second
如果dataSource参数在分区和行中都出现,则行中的-s表示“分区数据源中的数据源”。此配置表示一个包含两个行的分区,一个行的数据为“第1个值”,另一个行的数据为“第2个值”。
CellClass相当于单个行和行的元素数量参数以及(mPerRow)都可在分区和行中使用
section -c TableViewCell
row
row -c TableViewCell2
这意味着一个包含两个行的分区,一行的单元类为TableViewCell,另一个行的单元类为TableViewCell2。
当分区数据源是一个数组时,您可以在行中使用-es(元素源)参数
//_multipleArray = @[@{@"subs": @[@1, @2, @3]}, @{@"subs": @[@4, @5]}];
section -s _multipleArray
row -es subs
这意味着tableView有两个分区(你看到_multipleArray有两个元素),第一个分区有两个行,第二个分区有三个行。
注释
除mode、section和row以外的所有带有前缀的行都视为注释,因此您可以在任何想要的地方写它们。
参数快速查看
-s: 行或分区的数据源,它应该是TableViewProvider.dataProvider的成员变量。
-c: 行或分区的单元类,它应该是AOZTableViewCell的实现。
-h: 分区的头部视图类,它应该是AOZTableViewHeaderFooterView的实现。
-n: 每个分区或行中的元素数量。
-all: 如果数据源是数组,它表示所有元素都在同一行。
-es: 行的元素源,如果分区数据源是数组,则表示从中每个元素中搜索“查找值”。
-ec: 如果数据源为空(这意味着,如果源不是数组,则是nil;如果是数组,则nil或没有元素),则表示在此情况下使用的单元类。
-t: 另一个标签字符串。