JYForm
JYForm 是一个强大的iOS库,能够灵活、动态地创建和修改表单
要求
- ARC
- iOS 8.0+
- OC
目录
如何创建表格
JYForm
在创建时隐藏了复杂的实现细节,但它依旧能够拥有强大、灵活的修改表单的能力。
我们使用三个类来定义一个表格
- JYFormDescriptor
- JYFormSectionDescriptor
- JYFormRowDescriptor
一个表单即是一个JYFormDescriptor
对象,一个JYFormDescriptor
包含一个或多个JYFormSectionDescriptor
对象,一个JYFormSectionDescriptor
对象包含一个或多个JYFormRowDescriptor
对象。你可以注意到表单的结构(JYFormDescriptor --> JYFormSectionDescriptor --> JYFormRowDescriptor)类似于UITableView
的结构(Table --> Sections --> Rows)。
让我们先看一个例子,看看如何使用JYForm创建一个表单:
- (void)viewDidLoad {
[super viewDidLoad];
JYFormDescriptor *formDescriptor = [JYFormDescriptor formDescriptor];
JYFormSectionDescriptor *section = nil;
JYFormRowDescriptor *row = nil;
section = [JYFormSectionDescriptor formSectionWithTitle:nil];
[formDescriptor addFormSection:section];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"00" rowType:JYFormRowDescriptorTypeFloatLabeledTextField title:@"姓名"];
[section addFormRow:row];
row.required = YES;
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"01" rowType:JYFormRowDescriptorTypeFloatLabeledTextField title:@"身份证号"];
[section addFormRow:row];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"02" rowType:JYFormRowDescriptorTypeInteger title:@"手机号码"];
[section addFormRow:row];
row.required = YES;
section = [JYFormSectionDescriptor formSectionWithTitle:nil];
[formDescriptor addFormSection:section];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"10" rowType:JYFormRowDescriptorTypeText title:@"身份证地址"];
[section addFormRow:row];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"11" rowType:JYFormRowDescriptorTypeDate title:@"身份证有效期"];
[section addFormRow:row];
section = [JYFormSectionDescriptor formSectionWithTitle:nil];
[formDescriptor addFormSection:section];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"20" rowType:JYFormRowDescriptorTypeSelectorPush title:@"征信人类别"];
row.selectorOptions = [JYFormOptionsObject formOptionsObjectsWithValues:@[@1, @2, @3] displayTexts:@[@"主贷人", @"主贷人配偶", @"担保人"]];
row.selectorTitle = @"征信人类别";
[section addFormRow:row];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"21" rowType:JYFormRowDescriptorTypeSelectorPush title:@"贷款银行"];
row.selectorOptions = [JYFormOptionsObject formOptionsObjectsWithValues:@[@1, @2, @3] displayTexts:@[@"工行银行", @"农业银行", @"交通银行"]];
row.selectorTitle = @"贷款银行";
[section addFormRow:row];
section = [JYFormSectionDescriptor formSectionWithTitle:nil];
[formDescriptor addFormSection:section];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"30" rowType:JYFormRowDescriptorTypeInfo title:@"业务编号"];
row.value = @"1123131";
[section addFormRow:row];
JYForm *form = [[JYForm alloc] initWithFormDescriptor:formDescriptor autoLayoutSuperView:self。view];
[form beginLoading];
self。form = form;
}
在上面的代码中,当我们定义完表单的主体结构后,然后添加到父视图之后,可以调用-(void)beginLoading
来进行 tableview 的初始化操作。在之后如果我们想对表单进行修改的话(删除添加行,删除添加节,修改行的内容),可以通过直接修改JYFormSectionDescriptor
、JYFormRowDescriptor
的方式。这样的好处是你可以不必再花费时间在NSIndexPath
、UITableViewDelegate
、UITableViewDataSource
上了。
使用AutoLayout添加
在上面的例子中,我在创建JYForm
对象时是这样的:
JYForm *form = [[JYForm alloc] initWithFormDescriptor:formDescriptor autoLayoutSuperView:self。view];
这样可以将JYForm
直接添加到self.view
中,并自动使用NSLayout布局(JYForm
与父视图在垂直与水平方向的间隔均为0),在设备横屏或竖屏时都能完全填充父视图。如果需要更复杂的自动布局,你可能需要自己实现。
JYForm *form1 = [[JYForm alloc] initWithFormDescriptor:formDescriptor];
[self。view addSubview:form1];
//自动布局代码。。。
使用CGRect添加
你还可以使用CGRect对JYForm进行布局。
JYForm *form = [[JYForm alloc] initWithFormDescriptor:formDescriptor frame:CGRectMake(0, 0, 375。, 667。)];
[self。view addSubview:form];
[form beginLoading];
这种方式比较简单,但有几个缺点。
- 就是在设备横屏和竖屏时,JYForm的显示可能会不一样。
- 键盘弹出时的动画可能会有点生硬。
行的种类
文本输入行
JYFormRowDescriptorTypeText
NSString *const JYFormRowDescriptorTypeText = @"text";
这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeSentences(每句的首字母大写),autocorrectionType属性为UITextAutocorrectionTypeDefault,keyboardType属性为UIKeyboardTypeDefault
JYFormRowDescriptorTypeName
NSString *const JYFormRowDescriptorTypeName = @"name";
这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeWords(每个词的首字母大写),autocorrectionType属性为UITextAutocorrectionTypeNo,keyboardType属性为UIKeyboardTypeDefault
JYFormRowDescriptorTypeURL
NSString *const JYFormRowDescriptorTypeURL = @"url";
这种样式下,UITextField
的autocapitalizationType
属性为UITextAutocapitalizationTypeNone
(无大写),autocorrectionType
属性为UITextAutocorrectionTypeNo
,keyboardType
属性为UIKeyboardTypeURL
JYFormRowDescriptorTypeEmail
NSString *const JYFormRowDescriptorTypeEmail = @"email";
这种样式下,UITextField
的autocapitalizationType
属性为UITextAutocapitalizationTypeNone
(无大写),autocorrectionType
属性为UITextAutocorrectionTypeNo
,keyboardType
属性为UIKeyboardTypeEmailAddress
JYFormRowDescriptorTypePassword
NSString *const JYFormRowDescriptorTypePassword = @"password";
这种样式下,UITextField
的autocapitalizationType
属性为UITextAutocapitalizationTypeNone
(无大写),autocorrectionType
属性为UITextAutocorrectionTypeNo
,keyboardType
属性为UIKeyboardTypeASCIICapable
,并且secureTextEntry
属性为YES
JYFormRowDescriptorTypeNumber
NSString *const JYFormRowDescriptorTypeNumber = @"number";
这种样式下,UITextField
的autocapitalizationType
属性为UITextAutocapitalizationTypeNone
(无大写),autocorrectionType
属性为UITextAutocorrectionTypeNo
,keyboardType
属性为UIKeyboardTypeNumbersAndPunctuation
JYFormRowDescriptorTypeInteger
NSString *const JYFormRowDescriptorTypeInteger = @"integer";
这种样式下,UITextField
的autocapitalizationType
属性为UITextAutocapitalizationTypeNone
(无大写),autocorrectionType
属性为UITextAutocorrectionTypeNo
,keyboardType
属性为UIKeyboardTypeNumberPad
JYFormRowDescriptorTypeDecimal
NSString *const JYFormRowDescriptorTypeDecimal = @"decimal";
在这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNo,keyboardType属性为UIKeyboardTypeDecimalPad
JYFormRowDescriptorTypePhone
NSString *const JYFormRowDescriptorTypePhone = @"phone";
这种样式下,UITextField
的autocapitalizationType
属性为UITextAutocapitalizationTypeNone
(无大写),autocorrectionType
属性为UITextAutocorrectionTypeNo
,keyboardType
属性为UIKeyboardTypeNumberPad
JYFormRowDescriptorTypeTextView
NSString *const JYFormRowDescriptorTypeTextView = @"textView";
在这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeSentences(每句的首字母大写),autocorrectionType属性为UITextAutocorrectionTypeNo,keyboardType属性为UIKeyboardTypeDefault
选择行
选择行允许我们从某个选择列表中选择一行或几行
NSString *const JYFormRowDescriptorTypeSelectorPush = @"selectorPush";
NSString *const JYFormRowDescriptorTypeMultipleSelector = @"multipleSelector";
NSString *const JYFormRowDescriptorTypeSelectorActionSheet = @"selectorActionSheet";
NSString *const JYFormRowDescriptorTypeSelectorAlertView = @"selectorAlertView";
NSString *const JYFormRowDescriptorTypeSelectorPickerView = @"selectorPickerView";
单个选择项必须为JYFormOptionsObject对象(JYFormRowDescriptorTypeSelectorPush,JYFormRowDescriptorTypeMultipleSelector可能除外),JYFormOptionsObject有两个属性formDisplaytext(文本显示),formValue(实际值)。你需要将你想要添加的一些选择项添加到JYFormRowDescriptor的selectorOptions属性。
JYForm遵循下列的先后顺序来显示您的选择项文本
- 如果JYFormRowDescriptor的valueTransformer属性不为空,则会显示valueTransformer转换JYFormOptionsObject的formDisplaytext之后的文本。
- 直接显示JYFormOptionsObject的formDisplaytext文本
日期,时间行
JY表单项描述类型日期
NSString *const JYFormRowDescriptorTypeDate = @"date";
JY表单项描述类型时间
NSString *const JYFormRowDescriptorTypeTime = @"time";
JY表单项描述类型日期时间
NSString *const JYFormRowDescriptorTypeDateTime = @"datetime";
JY表单项描述类型倒计时计时器
NSString *const JYFormRowDescriptorTypeCountDownTimer = @"countDownTimer";
JY表单项描述类型日期内联
NSString *const JYFormRowDescriptorTypeDateInline = @"dateInline";
布尔行
NSString *const JYFormRowDescriptorTypeSwitch = @"switch";
NSString *const JYFormRowDescriptorTypeCheck = @"check";
其它行
步进器
NSString *const JYFormRowDescriptorTypeStepCounter = @"stepCounter";
你可以这样设置它
[row.cellConfigAtConfigure setObject:@YES forKey:@"stepControl。wraps"];
[row.cellConfigAtConfigure setObject:@10 forKey:@"stepControl。stepValue"];
[row.cellConfigAtConfigure setObject:@10 forKey:@"stepControl。minimumValue"];
[row.cellConfigAtConfigure setObject:@100 forKey:@"stepControl。maximumValue"];
滑块
NSString *const JYFormRowDescriptorTypeSlider = @"slider";
你可以这样设置它
[row.cellConfigAtConfigure setObject:@(100) forKey:@"slider。maximumValue"];
[row.cellConfigAtConfigure setObject:@(10) forKey:@"slider。minimumValue"];
[row.cellConfigAtConfigure setObject:@(4) forKey:@"steps"];
信息
NSString *const JYFormRowDescriptorTypeInfo = @"info";
有时我们需要一些不可编辑的行来展示信息(例如版本信息),JYForm提供了JYFormRowDescriptorTypeInfo
的行类型来展示不可编辑的信息。
按钮
NSString *const JYFormRowDescriptorTypeButton = @"button";
按钮行允许我们在选择行时执行某些操作,它按照以下规则来响应事件
- 如果
JYFormRowDescriptor
的action
的rowBlock
不为空,则执行该block - 如果
JYFormRowDescriptor
的action
的viewControllerClass
不为空,将跳转到该视图控制器
章节
行的删除
如果在JYForm中需要删除行,那么你需要这样初始化JYFormSectionDescriptor
对象
section = [JYFormSectionDescriptor formSectionWithTitle:@"Delete" sectionOptions:JYFormSectionOptionCanDelete];
[formDescriptor addFormSection:section];
当JYForm
的tableView
的editing
属性为YES时,样式如下
如果tableView
的editing
属性为NO,那么你可以通过左滑来删除行,效果如下
获取表单值
formValues
你可以通过调用JYForm
的- (NSDictionary *)formValues;
方法或JYFormDescriptor
的- (NSDictionary *)formValues;
方法,来获取到表单上每行的值。
结果NSDictionary
的创建规则如下
- 遍历每一行,如果这行的
tag
不为空,则以此行的tag
为key,该行的值(value为空时传[NSNull null])为value添加到字典中。 - 需要注意,如果该行是选中选择行类型,那么该行的值为
JYFormOptionsObject
对象,或者NSArray<JYFormOptionsObject *>
类型。
httpParameters
创建好表单后,常常需要将表单各行的值通过请求发送给后台。此时,你可以尝试调用JYForm
的- (NSDictionary *)httpParameters;
方法或JYFormDescriptor
的- (NSDictionary *)httpParameters:(JYForm *)form
方法来获取httpParameters
。
结果NSDictionary
的创建规则如下
- 如果该行实现了代理
JYFormDescriptorCell
的- (NSString *)formDescriptorHttpParameterName;
方法,则以该返回值为key,该行的值为value(value为空时传[NSNull null])添加到字典中。如果没有实现该方法且tag
不为空,则以tag
为key,行的值为value添加到字典中。 - 如果该行的值为
JYFormOptionsObject
对象,则添加的是JYFormOptionsObject
的formValue
属性;如果该行的值为NSArray<JYFormOptionsObject *>
类型,则添加到字典的值为NSArray<JYFormOptionsObject.formValue>
;如果该行的值为NSString
、NSNumber
、NSDate
类型,则返回该值本身。
如何自定义行呢
如果你想要创建自己的UITableViewCell
,那么一定要继承JYFormBaseCell
。必须实现JYFormDescriptorCell
代理。
@protocol JYFormDescriptorCell <NSObject>
@required
/**
初始化控件以及一些数据,在cell被创建时会被调用,只被调用一次
*/
- (void)configure;
/**
更新cell的控件,能被多次调用
*/
- (void)update;
@optional
/**
如果你没有指定JYFormRowDescriptor的height属性,并且这个方法被实现了,那么cell的高度为这个方法的返回值。
@param rowDescriptor JYFormRowDescriptor的实例
@return JYFormRowDescriptor对应的cell的高度
*/
+ (CGFloat)formDescriptorCellHeightForRowDescriptor:(JYFormRowDescriptor *)rowDescriptor;
/**
返回一个bool值,指示cell能够成为第一响应者,默认返回NO
@return 如果cell可以成为第一响应者的话返回YES,否则返回NO
*/
- (BOOL)formDescriptorCellCanBecomeFirstResponder;
/**
让当前的cell成为第一响应者
@return 如果cell是第一响应者了返回YES,否则返回NO
*/
- (BOOL)formDescriptorCellBecomeFirstResponder;
/**
当前的cell被选中了
@param form cell被添加到的JYForm的实例
*/
- (void)formDescriptorCellDidSelectedWithForm:(JYForm *)form;
/**
为该cell设置一个HttpParameterName,那么当调用JYFormDescriptor的实例方法-(void)httpParameters时,则会将该行,以方法返回值为key,值为value添加到结果字典中
@return 为该cell设置一个HttpParameterName,不能为空
*/
- (NSString *)formDescriptorHttpParameterName;
/**
当cell成为第一响应者时被调用,可以通过该方法改变cell的样式
*/
-(void)highlight;
/**
当cell退出第一响应者时被调用
*/
-(void)unhighlight;
@end
创建好新类JYFormTestCell
后,实现完代理方法后,在@implementation
后面将类添加到JYForm的cellClassesForRowDescriptorTypes
中,代码如下
+ (void)load
{
[JYForm。cellClassesForRowDescriptorTypes setObject:[JYFormTestCell class] forKey:@"Test"];
}
添加完成后,你可以在JYForm中直接添加这种类型的行:JYFormRowDescriptor *row = [JYFormRowDescriptor formRowDescriptorWithTag:@"test" rowType:@"Test"]
如何在运行中改变表格
对JYFormDescriptor
的修改都会映射到JYForm中的'tableView'上。例如,对JYFormSectionDescriptor
和JYFormRowDescriptor
进行添加和删除,会直接表现在section以及row的添加或删除。
也就是说,在JYForm中,我们再也不用使用NSIndexPath
来添加和删除UITableViewCell
。在JYForm中,每个JYFormRowDescriptor
都有tag
属性,我们可以通过JYFormDescriptor
查找tag
的方式来找到JYFormRowDescriptor
。通过tag
管理JYFormRowDescriptor
会更容易,类似于JS。因此,每个JYFormRowDescriptor
的tag
必须是唯一的。
通常来说,直接修改UITableView
的样式是不被允许的。你可以通过修改JYFormDescriptor
、JYFormSectionDescriptor
、JYFormRowDescriptor
来修改UITableView
。
隐藏row或者section
JYFormDescriptor
和JYFormSectionDescriptor
都有hidden
属性,你可以将其设置为YES,以达到隐藏的目的。
禁用
JYFormDescriptor
和JYFormSectionDescriptor
都有disable
属性,你可以将其设置为YES,以达到隐藏的目的。禁用时,row将处于不可编辑状态,只能显示信息,不能响应事件。
让row或者section是否可见依赖于其他row的值
JYForm允许你定义两个row的依赖关系,当一行的值发生改变时另一行产生响应的变化,代码如下
- (void)viewDidLoad {
[super viewDidLoad];
JYFormDescriptor *formDescriptor = [JYFormDescriptor formDescriptor];
JYFormSectionDescriptor *section = nil;
JYFormRowDescriptor *row = nil;
//第一段
section = [JYFormSectionDescriptor formSectionWithTitle:@"第一行"];
[formDescriptor addFormSection:section];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"00" rowType:JYFormRowDescriptorTypeSwitch title:@"显示下一行"];
row.onChangeBlock = ^(id oldValue, id newValue, JYFormRowDescriptor *rowDescriptor) {
JYFormRowDescriptor *nextRow = [formDescriptor formRowWithTag:@"01"];
if ([newValue boolValue]) {
nextrow.hidden = NO;
} else {
nextrow.hidden = YES;
}
};
[section addFormRow:row];
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"01" rowType:JYFormRowDescriptorTypeSwitch title:@"显示下一节"];
row.onChangeBlock = ^(id oldValue, id newValue, JYFormRowDescriptor *rowDescriptor) {
if ([newValue boolValue]) {
self。nextSection。hidden = NO;
} else {
self。nextSection。hidden = YES;
}
};
[section addFormRow:row];
row.hidden = YES;
//第二段
section = [JYFormSectionDescriptor formSectionWithTitle:@"依赖的section"];
[formDescriptor addFormSection:section];
section。hidden = YES;
self。nextSection = section;
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"10" rowType:JYFormRowDescriptorTypeName];
[row.cellConfigAtConfigure setObject:@"这是第二节" forKey:@"textField。placeholder"];
[row.cellConfigAtConfigure setObject:@(NSTextAlignmentLeft) forKey:@"textField。textAlignment"];
[section addFormRow:row];
JYForm *form = [[JYForm alloc] initWithFormDescriptor:formDescriptor autoLayoutSuperView:self。view];
[form beginLoading];
self。form = form;
// Do any additional setup after loading the view。
}
验证
JYForm提供验证功能,验证该行的值是否符合我们设定的条件。
每一个JYFormRowDescriptor
都可以有一个列表的验证器。通过下面的三个方法,我们可以添加,或者删除验证器,或者对该行进行验证。
- (void)addValidator:(nonnull id<JYFormValidatorProtocol>)validator;
- (void)removeValidator:(nonnull id<JYFormValidatorProtocol>)validator;
- (nullable JYFormValidationObject *)doValidation;
当JYFormRowDescriptor
进行验证doValidation
,如果结果不通过,会返回一个JYFormValidationObject
实例,该对象包含了错误信息以及所关联的JYFormRowDescriptor
实例。
我们可以创建自己的验证器,只需要实现JYFormValidatorProtocol
协议。
@protocol JYFormValidatorProtocol <NSObject>
@required
- (JYFormValidationObject *)isValid:(JYFormRowDescriptor *)row;
@end
JYFormRegexValidator
是JYForm创建的一个验证器,通过该类,你可以学习到一个验证器是如何工作的。
当JYFormRowDescriptor
的required
属性为YES时,那么如果该行值为空也是无法通过验证的。
你可以通过JYform
的- (NSArray *)formValidationErrors;
方法获取所有验证未通过的行的错误信息。
对Rows进行额外的配置
JYFormRowDescriptor
允许我们对UITableViewCell
进行一般配置,例如rowType
,value
,该行是否required
,hidden
,disabled
等。
当然,我们还可以使用KVC的方式对UITableViewCell
的其他属性进行设置。JYFormRowDescriptor
提供了四个配置字典,供用户在特定的时间段对UITableViewCell
进行配置。
///|< 配置cell,当JYForm调用update方法后使用
@property (nonnull, nonatomic, strong, readonly) NSMutableDictionary *cellConfigAfterUpdate;
///|< 配置cell,在JYFormOptionsViewController中的cellForRowAtIndexPath方法中被使用
@property (nonnull, nonatomic, strong, readonly) NSMutableDictionary *cellConfigForSelector;
///|< 配置cell,当JYForm调用update方法后,且disable属性为Yes时被使用
@property (nonnull, nonatomic, strong, readonly) NSMutableDictionary *cellConfigIfDisabled;
///|< 配置cell,当cell调用config之后,update方法之前调用
@property (nonnull, nonatomic, strong, readonly) NSMutableDictionary *cellConfigAtConfigure;
你可以这样进行配置
row = [JYFormRowDescriptor formRowDescriptorWithTag:@"name" rowType:JYFormRowDescriptorTypeText];
[row.cellConfigAtConfigure setObject:@"姓名" forKey:@"textField。placeholder"];
[row.cellConfigAtConfigure setObject:@(NSTextAlignmentLeft) forKey:@"textField。textAlignment"];
[row.cellConfigAtConfigure setObject:[UIColor redColor] forKey:@"textField。placeholderLabel。textColor"];
[section addFormRow:row];
更多例子请看Demo
常见问题解答 (FAQ)
如何给section自定义 header/footer
你也可以通过设置JYFormSectionDescriptor
的headerHeight
和HeaderView
或者footerHeight
和FooterView
属性来自定义header/footer
如何给row设置value
你可以设置row的属性value
@property (nullable, nonatomic, strong) id value;
你可以发现这个属性的类型是id
,所以你设置value时需要注意值的类型。例如,JYFormRowDescriptorTypeDate
的类型为NSDate
,JYFormRowDescriptorTypeText
的类型为NSString
。当设置完成之后,如果你需要刷新row的UI,你可以调用JYForm
的方法- (void)reloadFormRow:(JYFormRowDescriptor *)formRow;
如何给选择行添加选项
JYForm有若干的选择行类型,大部分的类型都必须要先知道选项(如果设置了action
的viewControllerClass
属性,JYFormRowDescriptorTypeSelectorPush,JYFormRowDescriptorTypeMultipleSelector不需要)。你可以通过设置JYFormRowDescriptor
的selectorOptions
属性来设置选项。
如何拿到表单的值
具体可以再看一眼上面的内容: 获取表单值
如何改变UITextField的长度占比
你可以通过下面的代码这样设置
//设置范围0 ~ 1。0f
[row.cellConfigAtConfigure setObject:[NSNumber numberWithFloat:0。7] forKey:XLFormTextFieldLengthPercentage];
设置UITextField可输入的最大字符数
[row.cellConfigAtConfigure setObject:@(20) forKey:@"textViewMaxNumberOfCharacters"];
如何改变UITextField的returnKeyType
[row.cellConfigAtConfigure setObject:@(UIReturnKeyGo) forKey:@"nextReturnKeyType"];
如何改变UITableViewCell的字体
可以在JYFormAppearanceConfig.h文件中,设置以下两个属性:
///|< cell主标题的字体
#define kJYForm_Cell_MainTextFont [UIFont preferredFontForTextStyle:UIFontTextStyleBody]
///|< cell副标题的字体
#define kJYForm_Cell_DetailTextFont [UIFont preferredFontForTextStyle:UIFontTextStyleBody]
如何改变UITableViewCell的字体颜色
可以在JYFormAppearanceConfig.h文件中,设置以下属性:
///|< cell主标题颜色
#define kJYForm_Cell_MainTextColor UIColorHex(333333)
///|< cell被禁用时主标题颜色
#define kJYForm_Cell_MainDisableTextColor UIColorHex(a4a4a4)
///|< cell副标题的颜色
#define kJYForm_Cell_DetailTextColor UIColorHex(464646)
///|< cell被禁用时副标题的颜色
#define kJYForm_Cell_DetailDisableTextColor UIColorHex(c8c8c8)
如何给日期行设置最大,最小日期
你可以通过下面的代码这样设置
[row.cellConfigAtConfigure setObject:[NSDate new] forKey:@"minimumDate"];
[row.cellConfigAtConfigure setObject:[NSDate dateWithTimeIntervalSinceNow:(60*60*24*3)] forKey:@"maximumDate"];
如何使整个表单处于禁用状态
form。disable = YES;
[form。tableView reloadData];
如何改变cell的高度
cell的高度优先级依次如下
- 指定JYFormRowDescriptor的
height
属性 - 实现
JYFormDescriptorCell
代理的方法+ (CGFloat)formDescriptorCellHeightForRowDescriptor:(JYFormRowDescriptor *)rowDescriptor;
- 以上都没有的话,则返回默认高度
static const CGFloat kCellestimatedRowHeight = 55;0;