XLForm的简单使用
2017-10-27 本文已影响233人
碧海云天V
前言
XLForm可以快速制作每一行风格都不一样的tableView,其自带的cell风格能满足大部分需求,同时也可以自定义cell。在使用XLForm时,需要通过cocoaPods导入。
1、创建XLForm
- 建立新页面时要继承 XLFormViewController
XLFormDescriptor * form; //建立表单,等同于创建uitableview
XLFormSectionDescriptor * section;//建立组 section
XLFormRowDescriptor * row;//建立行相当于cell
form = [XLFormDescriptor formDescriptor];//创建表单
self.form = form;
//--- 第一组 ---
section = [XLFormSectionDescriptor formSectionWithTitle:@""]; //创建区
[form addFormSection:section];
//第一行
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"date" rowType:XLFormRowDescriptorTypeDate title:@"Date"];//创建行
row.action.viewControllerClass = [MyViewController class];//cell的点击实现页面跳转
row.action.formSelector = @selector(touchEvent:);//指定cell点击时执行方法;
row.required = YES; //设置是否为必填项
row.height = 50; //可以手动设置行高
row.value = @"50%"; //设置要显示的值
[section addFormRow:row];
//--- 第二组 ---
section = [XLFormSectionDescriptor formSectionWithTitle:@""]; //创建区
[form addFormSection:section];
//第二行
[XLFormRowDescriptor formRowDescriptorWithTag:@"is_billable" rowType:XLFormRowDescriptorTypeBooleanSwitch title:@"Billable"]; //创建行
[section addFormRow:row];
- 在新的页面中可以直接使用tableView的delegate,此时delegate的优先级是最高的
//可以直接调用self.tableView
例1
self.tableView.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight-80);
例2
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 80;
}
2、监听值的变化
监听值的变化有两种方法
1.通过block回调
//block赋值
self.rowDescriptor.onChangeBlock(oldValue, newValue, rowDescriptor);
//block接收
row.onChangeBlock = ^(id _Nullable oldValue, id _Nullable newValue, XLFormRowDescriptor * _Nonnull rowDescriptor) {
NSLog(@"%@", newValue);
};
2.通过 - (void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)formRow oldValue:(id)oldValue newValue:(id)newValue方法接收
- (void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)formRow oldValue:(id)oldValue newValue:(id)newValue{
NSLog(@"%@", newValue);
}
3、自定义cell
- 自定义cell时要继承XLFormBaseCell
- 通过
[row.cellConfigForSelector setValue:@"value" forKey:@"key"];
设置自定义cell的值,在- (void)update { }
中做判断更新。
// 内部直接赋值
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];
}
// 这个方法是用来进行更新的,外面给唯一的字段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"];
//接收设置的值,并进行相应的操作
NSString *str = self.rowDescriptor.cellConfigForSelector[@"key"];
NSLog(@"%@", str);
}
- XLForm链接:https://github.com/xmartlabs/XLForm