[iOS]在XLForm使用純代碼自定義表單

因項目需要用到大量的表單提交,最初我是通過自己純代碼敲一個一個控件的敲,隨著表單需求多起來時,代碼量有點大,后來嘗試封裝效果不理想,最終發(fā)現(xiàn)了這個XLForm解決了我心頭之困,在很大程度上提高了表單制作的效率,也十分的靈活。其實網(wǎng)上也有很多關于此框架的文章,但發(fā)現(xiàn)對如何用純代碼自定義cell的表單編寫沒有文章介紹,以下就是我寫的demo中的代碼段的大致使用,有興趣可下載我的demo結合來讀 Demo傳送門

集成框架

如一般第三方框架一樣都需要導入到自己項目中XLForm,但要注意到是在你編寫表單的控制器中需要繼承XLFormViewController這個類

主要代碼說明

<pre>初始化- (instancetype)init
{
self = [super init];
if (self) {
[self initializeForm];
}
return self;
}

要對表單中的行禁止編輯用到的屬性
row.required = YES;

框架自帶的button cell中要想點擊出發(fā)方法用到的屬性
row.action.formSelector = @selector(insertBtnClick);

若要獲取表單中所有cell所填的值用到的方法如下,是以字典的方式保存
NSDictionary *allDict = [self formValues];
</pre>

自定義cell

自定義cell 有兩個很重要的方法需要重寫
<pre>
第一個:
此方法是用來設置屬性的 必須重寫 類似于初始化的屬性不變的屬性進行預先配置,純代碼在cell中添加控件和布局的代碼也是寫在此方法內(nèi)
-(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>

那問題來了,我點擊了保存按鈕,我在控制器中如何拿到保存繼而出發(fā)要執(zhí)行的方法,但這里貌似只能通過通知處理。
<pre>
-(void)saveBtnClick{

    [[NSNotificationCenter defaultCenter] postNotificationName:@"updataalterPswNotification" object:self];

}
</pre>

還有就是自定義pickerView選定后如何的數(shù)據(jù)控制器是如何拿到的呢,其實是通過將數(shù)據(jù)存到一個字典中,字典賦值給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這一行的數(shù)據(jù),其它的同理
<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>

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,241評論 4 61
  • 01 那天早上,我一打開房門,居然看到孩子還在穿襪子:“LT,你也才起來?你還沒吃飯?” 因為那時候早讀課的上課鈴...
    西瓜甜甜啦閱讀 680評論 13 31
  • 很多姑娘都希望擁有豐滿的胸部,但并不是所有的愿望都是可以如愿以償?shù)摹I聿氖翘焐m然通過后天的努力可以改變一部分,...
    futomix閱讀 738評論 0 0
  • 當一個人失去憤怒的能力,是相當相當可怕的。 被抑制的憤怒,會向內(nèi)自我攻擊。做為一個活生生的人的所有知覺,都會喪失。...
    自我覺察日記本閱讀 293評論 1 1
  • 2016-9-6晴 這兩天,有個朋友給我發(fā)來了一篇文章,主要寫的是戒網(wǎng)癮的故事,我看完后真的是不寒而栗…… 有的父...
    實干作品閱讀 137評論 0 0