因项目需要用到大量的表单提交,最初我是通过自己纯代码敲一个一个控件的敲,随着表单需求多起来时,代码量有点大,后来尝试封装效果不理想,最终发现了这个XLForm解决了我心头之困,在很大程度上提高了表单制作的效率,也十分的灵活。其实网上也有很多关于此框架的文章,但发现对如何用纯代码自定义cell的表单编写没有文章介绍,以下就是我写的demo中的代码段的大致使用,有兴趣可下载我的demo结合来读 Demo传送门
集成框架
如一般第三方框架一样都需要导入到自己项目中XLForm,但要注意到是在你编写表单的控制器中需要继承XLFormViewController这个类
主要代码说明
<pre>初始化- (instancetype)init
{
self = [super init];
if (self) {
[self initializeForm];
}
return self;
}
要对表单中的行禁止编辑用到的属性
row.required = YES;
框架自带的button cell中要想点击出发方法用到的属性
row.action.formSelector = @selector(insertBtnClick);
若要获取表单中所有cell所填的值用到的方法如下,是以字典的方式保存
NSDictionary *allDict = [self formValues];
</pre>
自定义cell
自定义cell 有两个很重要的方法需要重写
<pre>
第一个:
此方法是用来设置属性的 必须重写 类似于初始化的属性不变的属性进行预先配置,纯代码在cell中添加控件和布局的代码也是写在此方法内
-(void)configure
{
[super configure];
__weak typeof (self) weakSelf = self;
UIButton *saveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
saveBtn.backgroundColor = [UIColor clearColor];
[saveBtn setBackgroundImage:[UIImage imageNamed:@"btn_green_normal"] forState:UIControlStateNormal];
[saveBtn setTitle:@"保存" forState:UIControlStateNormal];
[weakSelf.contentView addSubview:saveBtn];
[saveBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(weakSelf.contentView);
make.centerX.equalTo(weakSelf.contentView);
make.width.equalTo(weakSelf.contentView).multipliedBy(0.8);
make.height.equalTo(weakSelf.contentView).multipliedBy(0.8);
}];
[saveBtn addTarget:self action:@selector(saveBtnClick) forControlEvents:UIControlEventTouchUpInside];
}
</pre>
那问题来了,我点击了保存按钮,我在控制器中如何拿到保存继而出发要执行的方法,但这里貌似只能通过通知处理。
<pre>
-(void)saveBtnClick{
[[NSNotificationCenter defaultCenter] postNotificationName:@"updataalterPswNotification" object:self];
}
</pre>
还有就是自定义pickerView选定后如何的数据控制器是如何拿到的呢,其实是通过将数据存到一个字典中,字典赋值给self.rowDescriptor.value
<pre>
-(void)saveClick{
WSDatePickerView *datepicker = [[WSDatePickerView alloc] initWithCompleteBlock:^(NSDate *startDate) {
NSString *date = [startDate stringWithFormat:@"yyyy-MM-dd "];
NSDictionary *dict = [NSDictionary dictionary];
dict = @{
@"data":date,
};
_dataLabel.text = date;
self.rowDescriptor.value = @{@"data":date};
}];
datepicker.datePickerStyle = DateStyleShowYearMonthDay;
datepicker.minLimitDate = [NSDate date:@"1970-1-01 " WithFormat:@"yyyy-MM-dd "];
datepicker.maxLimitDate = [NSDate date:@"2049-12-31 " WithFormat:@"yyyy-MM-dd "];
[datepicker show];
}
</pre>
而在控制器中,用之前说到的方法,就可以很开心的拿到pirkerView这一行的数据,其它的同理
<pre>
NSDictionary allDict = [self formValues];
</pre>
而点击了按钮后如何拿到cell中的值呢
接下来的是另一个重要的方法, 此方法是用来进行更新的,外面给唯一的字段Value设定值就好了 通过self.rowDescriptor.value的值变化来进行更新
<pre>
-(void)update{
[super update];
NSDictionary *value = self.rowDescriptor.value;
NSString *btnTag = [value objectForKey:@"btnTag"];
_btnTag = btnTag;
}
</pre>
此外要想一开始就给自定义cell中一个初始值,也是通过self.rowDescriptor.value进行
首先需要通过字典形式在控制器给需要初始值的cell赋值,如:
<pre>
//生日
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"birthday" rowType:XLFormRowDescriptorTypePickerDataCell title:@"生日:"];
row.disabled = @NO;
row.value = @{@"data":birthday};
[section addFormRow:row];
中的row.value = @{@"data":birthday};这个属性赋值
/---------------------华丽的分割线------------------------------/
在自定义cell中也通过字典拿
NSDictionary *dict = [NSDictionary dictionary];
dict = @{
@"data":date,
};
_dataLabel.text = date;
self.rowDescriptor.value = @{@"data":date};
</pre>