iOS XLForm速用教程

一 简述

XLForm 是最灵活且最强大的创建动态表单的iOS库。以下是这个库一个简单的结构图:


最主要的是红色方框的三个类:

XLFormRowDescriptorXLFormSectionDescriptorXLFormDescriptor
1.XLFormDescriptor结构和UITablView一样,有Section,有Row,它就是为成为UITableView的数据源而设计的。
2.XLFormRowDescriptor定义了每行表单的数据内容,包括行样式,标题,行类型,选择项内容,标签,合法性验证等。
3.XLFormSectionDescriptor是由XLFormRowDescriptor组合而成的,而XLFormSectionDescriptor最终又组成了XLFormDescriptor

二 用法

1.创建继承于XLFormViewController的ViewController。
2.创建表格:

XLFormDescriptor * form;//建立表单,等同于创建uitableview
XLFormSectionDescriptor * section;//建立组  section
XLFormRowDescriptor * row;//建立行相当于cell
//先将组添加到表单
//设置标题
form = [XLFormDescriptor formDescriptorWithTitle:@"Add Event"];
section = [XLFormSectionDescriptor formSection];
[form addFormSection:section];
// 添加一个cell
 row = [XLFormRowDescriptor formRowDescriptorWithTag:@"Title" rowType:XLFormRowDescriptorTypeText];
//设置placeholder
[row.cellConfigAtConfigure setObject:@"Title" forKey:@"textField.placeholder"];
row.required = YES;
[section addFormRow:row];

3.最后一步:
self.form = form; // 把form对象赋值给父类的form。不然不显示表单。
运行工程,简单三步一个简单的表单已然出现。并且XLForm已经将你的键盘管理的妥妥当当的。再也不担心遮挡输入框了😁。

三 自定义Cell

   // 内部直接赋值  
NSString * const XLFormRowDescriporTypeFloat = @"XLFormRowDescriporTypeFloat";  
  
@interface MKJFloatTextFieldCell () <UITextFieldDelegate>  
  
@end  
  
@implementation MKJFloatTextFieldCell  
  
// 在主表单中注册对应的cell以及对应的ID  
+(void)load  
{  
    [XLFormViewController.cellClassesForRowDescriptorTypes setObject:NSStringFromClass([MKJFloatTextFieldCell class]) forKey:XLFormRowDescriporTypeFloat];  
}  
  
// 这个方法是用来设置属性的 必须重写  类似于初始化的属性不变的属性进行预先配置  
- (void)configure  
{  
    [super configure];  
      
    self.selectionStyle = UITableViewCellSelectionStyleNone;  
    self.leftLabel.layer.borderColor = [UIColor yellowColor].CGColor;  
    self.leftLabel.layer.borderWidth = 1.0f;  
    self.textField.delegate = self;  
    self.textField.font = [UIFont boldSystemFontOfSize:16];  
    self.textField.floatingLabel.font = [UIFont boldSystemFontOfSize:11];  
    self.textField.clearButtonMode = UITextFieldViewModeWhileEditing;  
    self.textField.floatingLabelTextColor = [UIColor lightGrayColor];  
    self.textField.floatingLabelActiveTextColor = [UIColor redColor];  
      
}  
// 这个方法是用来进行更新的,外面给唯一的字段Value设定值就好了 通过self.rowDescriptor.value的值变化来进行更新  
- (void)update  
{  
    [super update];  
    NSDictionary *value = self.rowDescriptor.value;  
    self.leftLabel.text = [value objectForKey:@"left"];  
    self.textField.text = [value objectForKey:@"right"];  
    self.textField.attributedPlaceholder =  
    [[NSAttributedString alloc] initWithString:self.rowDescriptor.title  
                                    attributes:@{NSForegroundColorAttributeName: [UIColor lightGrayColor]}];  
    self.textField.floatingLabel.text = @"快点输入面积大小";  
}  
有些特定事件,需要在VC里面进行判断更新或者移除或者增加
     // 每个cell内部的参数属性更改了就会调用这个方法,我们再次更新的话就会调用cell里面update的方法进行重绘  
- (void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)formRow oldValue:(id)oldValue newValue:(id)newValue  
{  
    // 咱们这里统一调用更新  
    [super formRowDescriptorValueHasChanged:formRow oldValue:oldValue newValue:newValue];  
    [self updateFormRow:formRow];  
      
      
    // 以下就是一些典型的tag判断,根据不同的cell,remove 或 update进行更改  
//    if ([rowDescriptor.tag isEqualToString:@"first"]){  
//  
//    }  
//    else if ([rowDescriptor.tag isEqualToString:@"second"]){  
//  
//        [self updateFormRow:startDateDescriptor];  
//        [self updateFormRow:endDateDescriptor];  
//    }  
//    else if ([rowDescriptor.tag isEqualToString:@"third"]){  
//          
//            [self updateFormRow:endDateDescriptor];  
//          
//    }  
//    else if ([rowDescriptor.tag isEqualToString:@"这里填写的就是我们注册的ID"]){  
//          
//    }  
      
}  
表单填完了,无论自定义还是自带的,都要搜集填写的数据

1.验证数据合法性:[self formValidationErrors];
2.获取所有数据:[self formValues];

最后给大家一个cell样式的总汇

    #import "XLForm.h"  
// JVFloatLabeledTextField 普通的文本输入框,自带浮动动画  
NSString *const XLFormRowDescriptorTypeText = @"text";  
// add的时候展示名字的 JVFloatLabeledTextField  
NSString *const XLFormRowDescriptorTypeName = @"name";  
// 填写URL的cell  
NSString *const XLFormRowDescriptorTypeURL = @"url";  
NSString *const XLFormRowDescriptorTypeEmail = @"email";  
NSString *const XLFormRowDescriptorTypePassword = @"password";  
NSString *const XLFormRowDescriptorTypeNumber = @"number";  
NSString *const XLFormRowDescriptorTypePhone = @"phone";  
NSString *const XLFormRowDescriptorTypeTwitter = @"twitter";  
NSString *const XLFormRowDescriptorTypeAccount = @"account";  
NSString *const XLFormRowDescriptorTypeInteger = @"integer";  
// 选择更换头像图片的cell  
NSString *const XLFormRowDescriptorTypeImage = @"image";  
NSString *const XLFormRowDescriptorTypeDecimal = @"decimal";  
// JVFloat对应的textView的cell  
NSString *const XLFormRowDescriptorTypeTextView = @"textView";  
NSString *const XLFormRowDescriptorTypeZipCode = @"zipCode";  
// 非常普通的点击push选择  
NSString *const XLFormRowDescriptorTypeSelectorPush = @"selectorPush";  
NSString *const XLFormRowDescriptorTypeSelectorPopover = @"selectorPopover";  
NSString *const XLFormRowDescriptorTypeSelectorActionSheet = @"selectorActionSheet";  
NSString *const XLFormRowDescriptorTypeSelectorAlertView = @"selectorAlertView";  
NSString *const XLFormRowDescriptorTypeSelectorPickerView = @"selectorPickerView";  
NSString *const XLFormRowDescriptorTypeSelectorPickerViewInline = @"selectorPickerViewInline";  
NSString *const XLFormRowDescriptorTypeMultipleSelector = @"multipleSelector";  
NSString *const XLFormRowDescriptorTypeMultipleSelectorPopover = @"multipleSelectorPopover";  
NSString *const XLFormRowDescriptorTypeSelectorLeftRight = @"selectorLeftRight";  
// 三段选择  
NSString *const XLFormRowDescriptorTypeSelectorSegmentedControl = @"selectorSegmentedControl";  
// date 月 日 年  (内嵌)  
NSString *const XLFormRowDescriptorTypeDateInline = @"dateInline";  
// 日期picker选择器内嵌 dateTime更详细  星期 月 日 小时  分(内嵌)  
NSString *const XLFormRowDescriptorTypeDateTimeInline = @"datetimeInline";  
// date 小时 分 AM/PM(内嵌)  
NSString *const XLFormRowDescriptorTypeTimeInline = @"timeInline";  
// 计时器,选择hh mm(内嵌)  
NSString *const XLFormRowDescriptorTypeCountDownTimerInline = @"countDownTimerInline";  
// 月 日 年 sheet  
NSString *const XLFormRowDescriptorTypeDate = @"date";  
// 最详细的dateTime sheet  
NSString *const XLFormRowDescriptorTypeDateTime = @"datetime";  
// 小时 分 AM/PM  sheet  
NSString *const XLFormRowDescriptorTypeTime = @"time";  
// 计时器  底部弹出来的  
NSString *const XLFormRowDescriptorTypeCountDownTimer = @"countDownTimer";  
// 直接展示一大坨datePicker  
NSString *const XLFormRowDescriptorTypeDatePicker = @"datePicker";  
NSString *const XLFormRowDescriptorTypePicker = @"picker";  
// slider  
NSString *const XLFormRowDescriptorTypeSlider = @"slider";  
// 展示选中打钩的cell  
NSString *const XLFormRowDescriptorTypeBooleanCheck = @"booleanCheck";  
// 自带右边switch开关   
NSString *const XLFormRowDescriptorTypeBooleanSwitch = @"booleanSwitch";  
// button的cell  各种button位置需求  
NSString *const XLFormRowDescriptorTypeButton = @"button";  
// 简单的右侧描述信息的cell  
NSString *const XLFormRowDescriptorTypeInfo = @"info";  
// 展示segment count计数  
NSString *const XLFormRowDescriptorTypeStepCounter = @"stepCounter";  

传送门 XLForm GitHub

福利

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • HTML表单 在HTML中,表单是 ... 之间元素的集合,它们允许访问者输入文本、选择选项、操作对象等等,然后将...
    兰山小亭阅读 3,409评论 2 14
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 今天复习了元学习的第二课,并对知识点进行了整理,发现了好多新的和已经忘记了的知识。 先说新手进行学习的正确步骤: ...
    妄_念阅读 136评论 0 1
  • 曾经喜欢初夏,因为阳光很温暖。如今最爱初夏,因为那里有你。 去年的这个时候,我应该还在一遍一遍数着那封情书...
    木椋阅读 937评论 0 1
  • 最近被热播剧《三生三世十里桃花》刷屏了,好不容易等着素素跳了诛仙台,但是却开学了。那么如何有逼格的追剧,就看看《三...
    那个谁513阅读 369评论 0 0