JYForm 0.0.4

JYForm 0.0.4

kikido1992 维护。



JYForm 0.0.4

  • 作者:
  • 杜乾航

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 的初始化操作。在之后如果我们想对表单进行修改的话(删除添加行,删除添加节,修改行的内容),可以通过直接修改JYFormSectionDescriptorJYFormRowDescriptor的方式。这样的好处是你可以不必再花费时间在NSIndexPathUITableViewDelegateUITableViewDataSource上了。

使用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

JYFormRowDescriptorTypeText

JYFormRowDescriptorTypeName

NSString *const JYFormRowDescriptorTypeName = @"name";

这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeWords(每个词的首字母大写),autocorrectionType属性为UITextAutocorrectionTypeNo,keyboardType属性为UIKeyboardTypeDefault

JYFormRowDescriptorTypeName

JYFormRowDescriptorTypeURL

NSString *const JYFormRowDescriptorTypeURL = @"url";

这种样式下,UITextFieldautocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNokeyboardType属性为UIKeyboardTypeURL

JYFormRowDescriptorTypeURL

JYFormRowDescriptorTypeEmail

NSString *const JYFormRowDescriptorTypeEmail = @"email";

这种样式下,UITextFieldautocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNokeyboardType属性为UIKeyboardTypeEmailAddress

JYFormRowDescriptorTypeEmail

JYFormRowDescriptorTypePassword

NSString *const JYFormRowDescriptorTypePassword = @"password";

这种样式下,UITextFieldautocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNokeyboardType属性为UIKeyboardTypeASCIICapable,并且secureTextEntry属性为YES

JYFormRowDescriptorTypePassword

JYFormRowDescriptorTypeNumber

NSString *const JYFormRowDescriptorTypeNumber = @"number";

这种样式下,UITextFieldautocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNokeyboardType属性为UIKeyboardTypeNumbersAndPunctuation

JYFormRowDescriptorTypeNumber

JYFormRowDescriptorTypeInteger

NSString *const JYFormRowDescriptorTypeInteger = @"integer";

这种样式下,UITextFieldautocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNokeyboardType属性为UIKeyboardTypeNumberPad

JYFormRowDescriptorTypeInteger

JYFormRowDescriptorTypeDecimal

NSString *const JYFormRowDescriptorTypeDecimal = @"decimal";

在这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNo,keyboardType属性为UIKeyboardTypeDecimalPad

JYFormRowDescriptorTypeDecimal

JYFormRowDescriptorTypePhone

NSString *const JYFormRowDescriptorTypePhone = @"phone";

这种样式下,UITextFieldautocapitalizationType属性为UITextAutocapitalizationTypeNone(无大写),autocorrectionType属性为UITextAutocorrectionTypeNokeyboardType属性为UIKeyboardTypeNumberPad

JYFormRowDescriptorTypePhone

JYFormRowDescriptorTypeTextView

NSString *const JYFormRowDescriptorTypeTextView = @"textView";

在这种样式下,UITextField的autocapitalizationType属性为UITextAutocapitalizationTypeSentences(每句的首字母大写),autocorrectionType属性为UITextAutocorrectionTypeNo,keyboardType属性为UIKeyboardTypeDefault

JYFormRowDescriptorTypeTextView

选择行

选择行允许我们从某个选择列表中选择一行或几行

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

JYFormRowDescriptorTypeDate

JY表单项描述类型时间

NSString *const JYFormRowDescriptorTypeTime = @"time";

JYFormRowDescriptorTypeTime

JY表单项描述类型日期时间

NSString *const JYFormRowDescriptorTypeDateTime = @"datetime";

JYFormRowDescriptorTypeDateTime

JY表单项描述类型倒计时计时器

NSString *const JYFormRowDescriptorTypeCountDownTimer = @"countDownTimer";

JYFormRowDescriptorTypeCountDownTimer

JY表单项描述类型日期内联

NSString *const JYFormRowDescriptorTypeDateInline = @"dateInline";

JYFormRowDescriptorTypeDateInline

布尔行

NSString *const JYFormRowDescriptorTypeSwitch = @"switch";

JYFormRowDescriptorTypeSwitch

NSString *const JYFormRowDescriptorTypeCheck = @"check";

JYFormRowDescriptorTypeCheck

其它行

步进器

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"];

JYFormRowDescriptorTypeStepCounter

滑块

NSString *const JYFormRowDescriptorTypeSlider = @"slider";

你可以这样设置它

[row.cellConfigAtConfigure setObject:@(100) forKey:@"slider。maximumValue"];
[row.cellConfigAtConfigure setObject:@(10) forKey:@"slider。minimumValue"];
[row.cellConfigAtConfigure setObject:@(4) forKey:@"steps"];

JYFormRowDescriptorTypeSlider

信息

NSString *const JYFormRowDescriptorTypeInfo = @"info";

有时我们需要一些不可编辑的行来展示信息(例如版本信息),JYForm提供了JYFormRowDescriptorTypeInfo的行类型来展示不可编辑的信息。

JYFormRowDescriptorTypeInfo

按钮

NSString *const JYFormRowDescriptorTypeButton = @"button";

按钮行允许我们在选择行时执行某些操作,它按照以下规则来响应事件

  • 如果JYFormRowDescriptoractionrowBlock不为空,则执行该block
  • 如果JYFormRowDescriptoractionviewControllerClass不为空,将跳转到该视图控制器

章节

行的删除

如果在JYForm中需要删除行,那么你需要这样初始化JYFormSectionDescriptor对象

section = [JYFormSectionDescriptor formSectionWithTitle:@"Delete" sectionOptions:JYFormSectionOptionCanDelete];
    [formDescriptor addFormSection:section];
    

JYFormtableViewediting属性为YES时,样式如下

如果tableViewediting属性为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对象,则添加的是JYFormOptionsObjectformValue属性;如果该行的值为NSArray<JYFormOptionsObject *>类型,则添加到字典的值为NSArray<JYFormOptionsObject.formValue>;如果该行的值为NSStringNSNumberNSDate类型,则返回该值本身。

如何自定义行呢

如果你想要创建自己的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'上。例如,对JYFormSectionDescriptorJYFormRowDescriptor进行添加和删除,会直接表现在section以及row的添加或删除。

也就是说,在JYForm中,我们再也不用使用NSIndexPath来添加和删除UITableViewCell。在JYForm中,每个JYFormRowDescriptor都有tag属性,我们可以通过JYFormDescriptor查找tag的方式来找到JYFormRowDescriptor。通过tag管理JYFormRowDescriptor会更容易,类似于JS。因此,每个JYFormRowDescriptortag必须是唯一的。

通常来说,直接修改UITableView的样式是不被允许的。你可以通过修改JYFormDescriptorJYFormSectionDescriptorJYFormRowDescriptor来修改UITableView

隐藏row或者section

JYFormDescriptorJYFormSectionDescriptor都有hidden属性,你可以将其设置为YES,以达到隐藏的目的。

禁用

JYFormDescriptorJYFormSectionDescriptor都有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创建的一个验证器,通过该类,你可以学习到一个验证器是如何工作的。

JYFormRowDescriptorrequired属性为YES时,那么如果该行值为空也是无法通过验证的。

你可以通过JYform- (NSArray *)formValidationErrors;方法获取所有验证未通过的行的错误信息。

对Rows进行额外的配置

JYFormRowDescriptor允许我们对UITableViewCell进行一般配置,例如rowTypevalue,该行是否requiredhiddendisabled等。

当然,我们还可以使用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

你也可以通过设置JYFormSectionDescriptorheaderHeightHeaderView或者footerHeightFooterView属性来自定义header/footer

如何给row设置value

你可以设置row的属性value

@property (nullable, nonatomic, strong) id value;

你可以发现这个属性的类型是id,所以你设置value时需要注意值的类型。例如,JYFormRowDescriptorTypeDate的类型为NSDateJYFormRowDescriptorTypeText的类型为NSString。当设置完成之后,如果你需要刷新row的UI,你可以调用JYForm的方法- (void)reloadFormRow:(JYFormRowDescriptor *)formRow;

如何给选择行添加选项

JYForm有若干的选择行类型,大部分的类型都必须要先知道选项(如果设置了actionviewControllerClass属性,JYFormRowDescriptorTypeSelectorPush,JYFormRowDescriptorTypeMultipleSelector不需要)。你可以通过设置JYFormRowDescriptorselectorOptions属性来设置选项。

如何拿到表单的值

具体可以再看一眼上面的内容: 获取表单值

如何改变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;