前言
最近在开发一个APP,需要让用户填写数据,然后上传到服务端进行计算并返回结果在客户端中展示。其中需要填写的数据项多达十几项,大部分是必填。所有表单数据在一个页面中实现,在APP中这样的设计其实挺逆天的,但产品经理坚持要这么弄,也只能硬着头皮写。页面的表单数据样式五花八门,下图是其中几行截图

第一、二行的 textfield 其实是一个选择框,只能从下拉选项中选择一个。第三个只允许输入数字。
页面由另一个同学实现,表单的数据基本都在 cellForRowAtIndexPath 实现,结果是这样的:

看着这么多的if...else...一下子就凌乱了。让我怎么接手实现网络接口,上传表单数据,难道也写这么多的if...else...?这么实现之后要改其中某行数据的话,比如增加或删除一行表单,就得改N个地方。这样不仅浪费时间,而且容易出错,要么改错了要么没改全。这样的代码后期维护成本太高,只能重写了。那么问题来了,怎么改?从何开始?
XLForm
XLForm is the most flexible and powerful iOS library to create dynamic table-view forms. Fully compatible with Swift & Obj-C.
XLForm 是最灵活且最强大的创建动态表单的iOS库。更多的使用方法可以参考这篇文章:http://www.easck.com/article/138943.htm
以下是这个库一个简单的结构图:

最主要的是红色方框的三个类:XLFormRowDescriptor, XLFormSectionDescriptor,XLFormDescriptor。XLFormDescriptor结构和UITablView一样,有Section,有Row,它就是为成为UITableView的数据源而设计的。XLFormRowDescriptor定义了每行表单的数据内容,包括行样式,标题,行类型,选择项内容,标签,合法性验证等。XLFormSectionDescriptor是由XLFormRowDescriptor组合而成的,而XLFormSectionDescriptor最终又组成了XLFormDescriptor。
由于我们要实现的APP表单行样式更复杂,有的一行要提交两项数据,所以需要对XLFormRowDescriptor做些改动。代码如下:
@property (strong, nonatomic) NSMutableDictionary *cellConfig;
@property (strong, nonatomic) NSDictionary *textFieldConfig;
@property (strong, readonly, nonatomic) NSString *rowType;
@property (strong, readonly, nonatomic) NSArray *leftOptions;
@property (strong, readonly, nonatomic) WWEFormRightSelectorOption *rightOptions;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) id value;
@property (strong, nonatomic) NSString *tag;
@property (nonatomic) BOOL required;
@property (strong, nonatomic) WWEBaseTableViewCell *tableViewCell;
-(id)initWithRowType:(NSString *)rowType
title:(NSString *)title
leftOptions:(NSArray *)leftOptions
rightOptions:(WWEFormRightSelectorOption *)rightOptions;
-(WWEFormValidation *)doValidation;
@end
@interface WWEFormRightSelectorOption : NSObject
@property (readonly, nonatomic) NSArray *rightOptions;
@property (readonly, nonatomic) NSString *httpParameterKey;
@property (readonly, nonatomic) NSString *selectorTitle;
@property (nonatomic) NSInteger selectedIndex;
+(WWEFormRightSelectorOption *)formRightSelectorOptionWithTitle:(NSString *)title httpParameterKey:(NSString *)httpParameterKey rightOptions:(NSArray *)rightOptions;










