当前位置: 首页 > 工具软件 > XLForm > 使用案例 >

XLForm入门

谷永贞
2023-12-01

最近项目需要提交表单,先把需求截图附上

如果第一次看到这个页面真的不知道怎么去实现,如果用tableView的话一层层的if else会让人很抓狂,当然页面也不算复杂如果真的用tableView也是可以的.

接触XLForm也是在这个项目中,当时大概浏览了一下项目功能,发现之前有大牛已经做过类似功能,然后瞥见了这个66的第三方

第一次接触就简单在网上看了一下关于XLForm的相关文章,但是有点少,只是稍微一说,真正用的时候还是会遇到很多问题,接下来就来说一下XLForm的使用和坑的解决办法

想要使用XLForm就要创建一个基于XLFormViewController的控制器

#import <XLForm/XLForm.h>
@interface MyFormController : XLFormViewController
@end
复制代码

接下来创建组和表单

XLFormDescriptor *form;//form相当于tableView,事实上form就是基于tableView进行封装的
XLFormSectionDescriptor *section;
XLFormRowDescriptor *row;

form = [XLFormDescriptor formDescriptorWithTitle:@"我的表单"];
//第一个参数设置每个组的标题   第二个参数设置row的类型(插入,删除,可移动)     第三个参数   当row为插入时设置插入方式(最后一行加入添加按钮,在最后一行下方添加添加按钮)
section = [XLFormSectionDescriptor formSectionWithTitle:@"section" sectionOptions:XLFormSectionOptionCanInsert 
sectionInsertMode:XLFormSectionInsertModeButton];
[form addFormSection:section];
//设置XLFormRowDescriptorTypeSelectorPush类型控制器必须是被push出来的,如果是present就不会跳转到下级选择页面
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"class" rowType:XLFormRowDescriptorTypeSelectorPush title:@"类目"];
row.value = [XLFormOptionsObject formOptionsObjectWithValue:@(0) displayText:@"请选择类目"];
row.selectorOptions = @[
                            [XLFormOptionsObject formOptionsObjectWithValue:@(1) displayText:@"Every Day"],
                            [XLFormOptionsObject formOptionsObjectWithValue:@(2) displayText:@"Every Week"],
                            [XLFormOptionsObject formOptionsObjectWithValue:@(3) displayText:@"Every 2 Weeks"],
                            [XLFormOptionsObject formOptionsObjectWithValue:@(4) displayText:@"Every Month"],
                            [XLFormOptionsObject formOptionsObjectWithValue:@(5) displayText:@"Every Year"],
                            ];
[section addFormRow:row];


row = [XLFormRowDescriptor formRowDescriptorWithTag:@"shopTitle" rowType:XLFormRowDescriptorTypeText title:@""];
//当要修改cell中属性时要用到Config这个属性,通过kvc赋值来改变
[row.cellConfigAtConfigure setObject:@"请输入商品标题" forKey:@"textField.placeholder"];
[section addFormRow:row];

//最后不要忘记这句话
self.form = form;
复制代码

上面这些就是XLForm的简单使用,这些类型可以直接从Demo上拷贝下来使用,只是注意一下我注释中的那些细节就可以了,如果不注意的话可能要找好久~~~

接下来就是自定义Row了,其实也挺简单的,类似自定义tableViewCell

#param mark---- 我用的Xib不是纯代码
#import "XLFormGoodsPriceCell.h"


NSString *const XLFormRowDescriptorTypeGoodsPrice = @"price";
@interface XLFormGoodsPriceCell ()

@property (weak, nonatomic) IBOutlet UITextField *priceTextField;
@property (weak, nonatomic) IBOutlet UIButton *priceBtn;
@property (weak, nonatomic) IBOutlet UIButton *onceBtn;

@property (nonatomic, strong) NSDictionary *dict;

@end

@implementation XLFormGoodsPriceCell
- (NSDictionary *)dict{
    if (!_dict) {
        _dict = [NSDictionary dictionary];
    }
    return _dict;
}

+ (void)load{
    [XLFormViewController.cellClassesForRowDescriptorTypes setObject:NSStringFromClass([self class]) forKey:XLFormRowDescriptorTypeGoodsPrice];
}

- (void)configure{
    [super configure];
    self.selectionStyle = UITableViewCellSelectionStyleNone;
}

- (void)update{
    [super update];
    
}

- (IBAction)price:(UIButton *)sender {
    self.onceBtn.selected = NO;
    sender.selected = YES;
}


- (IBAction)oncePrice:(UIButton *)sender {
    self.priceBtn.selected = NO;
    sender.selected = YES;
}


//设置Row的高度
+(CGFloat)formDescriptorCellHeightForRowDescriptor:(XLFormRowDescriptor *)rowDescriptor
{
    return 60;
}
复制代码
//自定义row类型(仔细看XLForm的Demo,你会发现使用自定义Row的时候只导入了Row的头文件,但是row不需要用[类名  alloc]这样的方式去创建,其实它是通过Type来映射到这个类中,相当于工厂模式)
NSString *const XLFormRowDescriptorTypeGoodsPrice = @"price";

//这个类型要在.h中展现出来,并且要用extern声明以便其它类能访问到
extern NSString * const XLFormRowDescriptorTypeGoodsPrice;

//这三个方法要自己重写
+ (void)load{
    //xib  setObject的时候要把class转NSString(但是在纯代码中可以[类名 class]直接使用)
    [XLFormViewController.cellClassesForRowDescriptorTypes setObject:NSStringFromClass([self class]) forKey:XLFormRowDescriptorTypeGoodsPrice];
}

- (void)configure{
    [super configure];
    self.selectionStyle = UITableViewCellSelectionStyleNone;
}

- (void)update{
    [super update];

}

复制代码

###下一个就是添加的Row

section = [XLFormSectionDescriptor formSectionWithTitle:nil sectionOptions:XLFormSectionOptionCanInsert sectionInsertMode:XLFormSectionInsertModeButton];
[form addFormSection:section];
    
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"about" rowType:XLFormRowDescriptorTypeAbout];
[section addFormRow:row];
复制代码

Ps:XLFormSection中的XLFormSectionOptionCanInsert添加的是当前组的第一个类型的Row 因为最后一行的点击添加是添加的最后一行相同的Row,所以要单独把那个Row拿出来当成单独的section

遇到的大概就是这些问题,有些不懂的还请大神指点,多谢多谢...

 类似资料: