尷尬。截圖不知道怎么控制圖片大小,所以就不貼圖片了。
近期謝了一個關(guān)于表單提交的項目模塊:
就類似企業(yè)內(nèi)部管理中申請模塊,基本上全部是表單提交數(shù)據(jù):
所以就找到了XLFrom做界面開發(fā),開始用起來還是不太習慣,慢慢就好了。最主要就是關(guān)于XLFrom網(wǎng)上的資料太少了。
不扯遠了,上代碼:
首先,這個XLFrom是一個以UITableView為基礎(chǔ)的框架。但是也不需要tableview的代理,基本上需要實現(xiàn)的東西XLFrom里面都實現(xiàn)了,如果另有需求,當我沒說。
注意:
.h文件的話 需要繼承XLFormViewController
#import <XLForm/XLForm.h>
@interface DemoViewController : XLFormViewController
@end
實現(xiàn):
初始化form表單
// 表單對象
XLFormDescriptor *form;
// 初始化form 添加title
form = [XLFormDescriptor formDescriptorWithTitle:@""];
接著創(chuàng)建section 和row
// 表單Section對象
XLFormSectionDescriptor *section;
// 表單Row對象
XLFormRowDescriptor *row;
注意:下文中XLFormRowDescriporField是自己定義類型的cell,如果不需要自己特殊定義的話,也可以參考From里面已經(jīng)有的,文章最后貼出來
//部門
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"apartmentName" rowType:XLFormRowDescriporField title:@"部門"];
row.disabled = @NO;
row.value = departmentName;
[section addFormRow:row];
//姓名
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"memberName" rowType:XLFormRowDescriporField title:@"姓名"];
row.disabled = @NO;
row.value = userName;
[section addFormRow:row];
這個后面基本上就是重復的了,需要section就添加section,需要row就添加row添加自己想要的類型就可以了。
把庫文件導入自己工程,偶爾去試一試有什么樣的cell,我這邊會添加自己用到過的幾種。
然后關(guān)于取值:
我感覺最強大的就是它的取值了:
NSDictionary *dict = [self formValues];
NSLog(@"%@",dict);
這樣就能將表單所有的值取出來,以一個字典的形式,可以自己打印看看,里面的鍵就是設(shè)置的“tag”
注意:
這個表單在全局不管哪個地方都能取到其中的cell
//直接賦值
[self.form formRowWithTag:@"list"].value = [XLFormOptionsObject formOptionsObjectWithValue:id displayText:@"1"];
//單獨取出來一個row,可以對這個row進行處理
XLFormRowDescriptor * list = [self.form formRowWithTag:@"list"];
其中有一個選擇的類型賦值,我在網(wǎng)上沒有找到資料,自己看到的。
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"list" rowType:XLFormRowDescriporChooseSelector title:@"列表"];
row.selectorOptions = @[@"請選擇列表值"];
//就這個value這里,利用XLFormOptionsObject對這個pickview進行賦值
row.value = [XLFormOptionsObject formOptionsObjectWithValue:@"" displayText:@"請選擇"];
[section addFormRow:row];
關(guān)于XLFormOptionsObject
這個東西有點坑爹,最能體現(xiàn)的地方就是做值判斷的時候,畢竟做表單提交,肯定是要判空或者判@""
XLFormOptionsObject有兩個屬性:formValue和displayText
displayText是String類型放外面顯示的名字
formValue是id類型 隨便存什么東西,去相對應就好了
注意:
前面賦值用
[XLFormOptionsObject formOptionsObjectWithValue:@"" displayText:@"請選擇"];
不然后面不好進行判斷
判斷:
//我這里formValue存的是一個字符串,如果你們存的是id類型的,判空就行了
XLFormOptionsObject * listData = dict[@"list"];
if ([listData.formValue isEqualToString:@""] || [listData.displayText isEqualToString:@"請選擇"]) {
//提示語句
return NO;
}
更更更更更新
一個動態(tài)隱藏cell
剛剛用到一個關(guān)于動態(tài)隱藏的地方,找了官方的Demo弄了半天才弄好,其實本來并不是很麻煩只需要利用NSPredicate就可以了,但是由于已經(jīng)把大家?guī)У搅?code>XLFormOptionsObject這個坑里面,還是填補一下比較好
他們文檔里面是執(zhí)行這個方法
-(void)setHidden:(id)hidden
{
if ([_hidden isKindOfClass:[NSPredicate class]]){
[self.sectionDescriptor.formDescriptor removeObserversOfObject:self predicateType:XLPredicateTypeHidden];
}
_hidden = [hidden isKindOfClass:[NSString class]] ? [hidden formPredicate] : hidden;
if ([_hidden isKindOfClass:[NSPredicate class]]){
[self.sectionDescriptor.formDescriptor addObserversOfObject:self predicateType:XLPredicateTypeHidden];
}
[self evaluateIsHidden]; // check and update if this row should be hidden.
}
像用到了XLFormOptionsObject這個來保存選擇值的小伙子們可以這樣進行判斷:
//在選擇完畢之后執(zhí)行的方法
- (void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)formRow oldValue:(id)oldValue newValue:(id)newValue
{
//操作是選list 然后把其他的cell 隱藏起來
//判斷是否選擇了list hidden是NSPredicate處理問題
if ([formRow.tag isEqualToString:@"list"]) {
//用XLFormOptionsObject把數(shù)據(jù)接收出來
XLFormOptionsObject * obj = formRow.value;
//用formDisplayText 或者formValue做判斷都行,不過最好是用formDisplayText畢竟判斷字符好些
EAPLog(@"鍵:%@",obj.formDisplayText);
EAPLog(@"值:%@",obj.formValue);
//這里進行判斷 就能執(zhí)行了 NSPredicate里面還可以寫很多判斷方式
[self.form formRowWithTag:@"listTwo"].hidden =[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"'%@' contains 'hidden'",obj.formDisplayText]];
}
}
注意注意
看庫里面的Demo如果沒有用到XLFormOptionsObject就方便多了。
都不用去執(zhí)行方法里面去,直接在初始化的時候給他設(shè)置hidden就行了?!皊witch”指向的是這個cell的操作按鈕,開關(guān)形式的。
//只要switch的value為1就顯示第一個row,為0就隱藏
row = [XLFormRowDescriptor formRowDescriptorWithTag:kPredDep2 rowType:XLFormRowDescriptorTypeInteger title:@"Integer"];
row.hidden = [NSString stringWithFormat:@"$switch==0"];
[section addFormRow:row];
row = [XLFormRowDescriptor formRowDescriptorWithTag:@"switch" rowType:XLFormRowDescriptorTypeBooleanSwitch title:@"Boolean"];
row.value = @1;
[section addFormRow:row];
暫時更新到這里。后面如果有用到繼續(xù)更新...
尾部貼上XLFrom中cell類型,求大神幫我看下有哪些用途:
如有時間,還望不吝賜教,感激。。
#import "XLForm.h"
NSString *const XLFormRowDescriptorTypeText = @"text";
NSString *const XLFormRowDescriptorTypeName = @"name";
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";
NSString *const XLFormRowDescriptorTypeImage = @"image";
NSString *const XLFormRowDescriptorTypeDecimal = @"decimal";
NSString *const XLFormRowDescriptorTypeTextView = @"textView";
NSString *const XLFormRowDescriptorTypeZipCode = @"zipCode";
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";
NSString *const XLFormRowDescriptorTypeDateInline = @"dateInline";
NSString *const XLFormRowDescriptorTypeDateTimeInline = @"datetimeInline";
NSString *const XLFormRowDescriptorTypeTimeInline = @"timeInline";
NSString *const XLFormRowDescriptorTypeCountDownTimerInline = @"countDownTimerInline";
NSString *const XLFormRowDescriptorTypeDate = @"date";
NSString *const XLFormRowDescriptorTypeDateTime = @"datetime";
NSString *const XLFormRowDescriptorTypeTime = @"time";
NSString *const XLFormRowDescriptorTypeCountDownTimer = @"countDownTimer";
NSString *const XLFormRowDescriptorTypeDatePicker = @"datePicker";
NSString *const XLFormRowDescriptorTypePicker = @"picker";
NSString *const XLFormRowDescriptorTypeSlider = @"slider";
NSString *const XLFormRowDescriptorTypeBooleanCheck = @"booleanCheck";
NSString *const XLFormRowDescriptorTypeBooleanSwitch = @"booleanSwitch";
NSString *const XLFormRowDescriptorTypeButton = @"button";
NSString *const XLFormRowDescriptorTypeInfo = @"info";
NSString *const XLFormRowDescriptorTypeStepCounter = @"stepCounter";