亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現自定義表單實例代碼

2020-07-26 02:28:40
字體:
來源:轉載
供稿:網友

前言

最近在開發一個APP,需要讓用戶填寫數據,然后上傳到服務端進行計算并返回結果在客戶端中展示。其中需要填寫的數據項多達十幾項,大部分是必填。所有表單數據在一個頁面中實現,在APP中這樣的設計其實挺逆天的,但產品經理堅持要這么弄,也只能硬著頭皮寫。頁面的表單數據樣式五花八門,下圖是其中幾行截圖

第一、二行的 textfield 其實是一個選擇框,只能從下拉選項中選擇一個。第三個只允許輸入數字。

頁面由另一個同學實現,表單的數據基本都在 cellForRowAtIndexPath 實現,結果是這樣的:


看著這么多的if...else...一下子就凌亂了。讓我怎么接手實現網絡接口,上傳表單數據,難道也寫這么多的if...else...?這么實現之后要改其中某行數據的話,比如增加或刪除一行表單,就得改N個地方。這樣不僅浪費時間,而且容易出錯,要么改錯了要么沒改全。這樣的代碼后期維護成本太高,只能重寫了。那么問題來了,怎么改?從何開始?

XLForm

XLForm is the most flexible and powerful iOS library to create dynamic table-view forms. Fully compatible with Swift & Obj-C.

XLForm 是最靈活且最強大的創建動態表單的iOS庫。更多的使用方法可以參考這篇文章:http://www.49028c.com/article/138943.htm

以下是這個庫一個簡單的結構圖:

最主要的是紅色方框的三個類:XLFormRowDescriptor, XLFormSectionDescriptor,XLFormDescriptor。XLFormDescriptor結構和UITablView一樣,有Section,有Row,它就是為成為UITableView的數據源而設計的。XLFormRowDescriptor定義了每行表單的數據內容,包括行樣式,標題,行類型,選擇項內容,標簽,合法性驗證等。XLFormSectionDescriptor是由XLFormRowDescriptor組合而成的,而XLFormSectionDescriptor最終又組成了XLFormDescriptor。

由于我們要實現的APP表單行樣式更復雜,有的一行要提交兩項數據,所以需要對XLFormRowDescriptor做些改動。代碼如下:

@property (strong, nonatomic) NSMutableDictionary *cellConfig;@property (strong, nonatomic) NSDictionary *textFieldConfig;@property (strong, readonly, nonatomic) NSString *rowType;@property (strong, readonly, nonatomic) NSArray *leftOptions;@property (strong, readonly, nonatomic) WWEFormRightSelectorOption *rightOptions;@property (strong, nonatomic) NSString *title;@property (strong, nonatomic) id value;@property (strong, nonatomic) NSString *tag;@property (nonatomic) BOOL required;@property (strong, nonatomic) WWEBaseTableViewCell *tableViewCell;-(id)initWithRowType:(NSString *)rowType  title:(NSString *)title  leftOptions:(NSArray *)leftOptions rightOptions:(WWEFormRightSelectorOption *)rightOptions;-(WWEFormValidation *)doValidation;@end@interface WWEFormRightSelectorOption : NSObject@property (readonly, nonatomic) NSArray *rightOptions;@property (readonly, nonatomic) NSString *httpParameterKey;@property (readonly, nonatomic) NSString *selectorTitle;@property (nonatomic) NSInteger selectedIndex;+(WWEFormRightSelectorOption *)formRightSelectorOptionWithTitle:(NSString *)title      httpParameterKey:(NSString *)httpParameterKey      rightOptions:(NSArray *)rightOptions;

這樣,表單數據就獨立于UI,TableViewCell是可配置的。通過XLFormRowDescriptor 來配置TableViewCell。只要指定行類型,就給出相應的類型的Cell。TableViewController中的Cell是由XLFormRowDescriptor提供的。

- (WWEBaseTableViewCell *)tableViewCell { if (!_tableViewCell) { id cellClass = [self cellClassesForRowDescriptorTypes][self.rowType]; NSAssert(cellClass, @"Not defined XLFormRowDescriptorType: %@", self.rowType ?: @"");  _tableViewCell = [[cellClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];  NSAssert([_tableViewCell isKindOfClass:[WWEBaseTableViewCell class]], @"UITableViewCell must extend from WWEBaseTableViewCell"); _tableViewCell.rowDescriptor = self; } return _tableViewCell;}

那么 XLFormRowDescriptor 怎么根據不同的行給出不同的cell?cell需要繼承同一個父類,這個父類足夠簡單,只有一個WWEFormRowDescriptor屬性,其它需要實現的方法則由WWECellProtocal負責。

@class WWEFormRowDescriptor;@interface WWEBaseTableViewCell : UITableViewCell<WWECellProtocal>@property (nonatomic, weak) WWEFormRowDescriptor *rowDescriptor;@end
@class WWEFormRowDescriptor;@protocol WWECellProtocal <NSObject>@required@property (nonatomic, weak) WWEFormRowDescriptor *rowDescriptor;-(void)configure;-(void)update;@end

另外,將表單配置數據獨立出來,而不是寫死在代碼中。使用plist文件,這樣初始化form時只需讀取這個文件,就完成了cell的配置。后續如果要改動表單的內容,不改動樣式,就只需修改plist文件,而無需改動代碼。

最后TableViewController的代碼就格外簡單了:

這樣上傳表單數據就無比輕松了, [self.form localValidationErrors] 驗證數據合法性,全部合法的話再調用 [self.form httpParameters] 就獲取了所有的表單數據,傳給網絡接口就大功告成了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费视频一区二区| 国产精品27p| 欧美影院在线播放| 97超级碰在线看视频免费在线看| 国产视频在线观看一区二区| 91视频国产精品| 韩国视频理论视频久久| 亚洲久久久久久久久久久| 北条麻妃一区二区在线观看| 久久综合免费视频影院| 91网在线免费观看| 欧美日韩xxx| 国产精品91在线| 黑人巨大精品欧美一区免费视频| 日韩欧美在线免费| 亚洲人成在线一二| 一区二区三区无码高清视频| 久久久人成影片一区二区三区| 久久这里只有精品99| 热re91久久精品国99热蜜臀| 欧美性理论片在线观看片免费| 国产丝袜一区视频在线观看| 蜜臀久久99精品久久久无需会员| 日本一区二三区好的精华液| 欧洲成人午夜免费大片| 性欧美长视频免费观看不卡| 另类色图亚洲色图| 国产视频综合在线| 亚洲第一色中文字幕| 不卡av日日日| 亚洲欧美日韩精品| 亚洲国产成人精品久久久国产成人一区| 国产精品爽爽爽爽爽爽在线观看| 免费av在线一区| 欧美极品少妇与黑人| 精品久久久久久久久久久久| 中文字幕日韩视频| 综合欧美国产视频二区| 高清视频欧美一级| 欧美老妇交乱视频| 夜色77av精品影院| 91嫩草在线视频| 精品国产乱码久久久久久虫虫漫画| 69久久夜色精品国产69| 日韩美女免费观看| 国产精品久久久久久久久久小说| 久久五月天色综合| 欧美日韩一区二区三区在线免费观看| 国产伦精品一区二区三区精品视频| 亚洲人成网站777色婷婷| 日韩一区二区欧美| 日韩国产欧美精品一区二区三区| 一区二区国产精品视频| 亚洲bt天天射| 日韩美女主播视频| 久久久国产视频| 亚洲精品福利免费在线观看| 欧美黑人一级爽快片淫片高清| 97精品国产97久久久久久春色| 久久久久免费精品国产| 国产成人精品免费视频| 国产日韩在线一区| 欧美亚洲日本黄色| 亚洲小视频在线观看| 欧美精品18videos性欧美| 国产精品美女久久久免费| 欧美成人三级视频网站| 日韩电影在线观看免费| 日韩中文字幕不卡视频| x99av成人免费| 亚洲色图18p| 国产精品久久97| 日韩在线视频网| 亚洲国产精品久久精品怡红院| 日韩欧美国产视频| 欧美激情视频免费观看| www.久久撸.com| 国产视频丨精品|在线观看| 久久久亚洲欧洲日产国码aⅴ| 在线观看日韩欧美| 欧美在线性爱视频| 国产免费一区二区三区在线观看| 欧美激情a∨在线视频播放| 亚洲精品久久久一区二区三区| 国产精品电影观看| 欧美精品做受xxx性少妇| 国产999精品久久久| 亚洲国产精品成人精品| 九九热精品视频国产| 国产mv久久久| 色哟哟入口国产精品| 免费91麻豆精品国产自产在线观看| 欧美制服第一页| 欧美视频在线视频| 97成人超碰免| 91九色蝌蚪国产| 高清欧美性猛交xxxx黑人猛交| 91高清视频在线免费观看| 欧美日韩免费一区| 8x海外华人永久免费日韩内陆视频| 国产精品黄页免费高清在线观看| 狠狠躁夜夜躁人人爽天天天天97| 97精品视频在线观看| 欧美性开放视频| 亚洲精品国产成人| 精品久久久久久久久中文字幕| 亚洲第一网站男人都懂| 欧美成人精品不卡视频在线观看| 亚洲一区国产精品| 亚洲免费电影在线观看| 欧美激情按摩在线| 日韩综合视频在线观看| 亚洲a成v人在线观看| 亚洲韩国青草视频| 亚洲国产成人精品一区二区| 日韩高清av一区二区三区| 欧洲成人午夜免费大片| 国产日韩在线精品av| 97高清免费视频| 精品国产一区二区三区久久狼黑人| 亚洲香蕉伊综合在人在线视看| 国产精品免费一区| 91国产一区在线| 欧美视频在线看| 一区二区av在线| 欧美黑人狂野猛交老妇| 欧美性猛交99久久久久99按摩| 亚洲天堂影视av| 国内外成人免费激情在线视频| 国产精品日韩在线观看| 欧美日韩第一页| 欧美性开放视频| 欧美午夜精品伦理| 狠狠躁夜夜躁人人爽超碰91| 亚洲a级在线播放观看| 久久久999精品免费| 国内精品久久久久| 欧美日韩精品在线观看| 久久久久久一区二区三区| 伊人青青综合网站| 亚洲人成毛片在线播放| 成人激情黄色网| 国产精品高潮呻吟久久av黑人| 91亚洲国产成人久久精品网站| 欧美午夜视频在线观看| 亚洲人成网站色ww在线| 日本免费一区二区三区视频观看| 国产精品久久一区主播| 日韩欧美国产骚| 日韩av在线网址| 国产999精品视频| 亚洲精品久久久久中文字幕二区| 国外日韩电影在线观看| 国产日韩在线观看av| 亚洲人成在线一二| 中国china体内裑精亚洲片| 欧美一区亚洲一区| 成人激情av在线| 456亚洲影院| 欧美xxxx做受欧美| 日韩欧美国产免费播放| 亚洲精品欧美一区二区三区| 日韩激情av在线播放| 久久精品国产一区二区电影|