上一版本扯了太多廢話缨伊,抱歉。
經(jīng)過一個(gè)項(xiàng)目的使用进宝,我個(gè)人的感覺是刻坊,就是好用!
總而言之党晋,這個(gè)玩意就是能少些一大堆賦值語句谭胚。也僅僅能少寫一大堆賦值語句。不想寫賦值語句的可以試試未玻,原理也很簡單漏益,大家可以試著自己封裝一個(gè),哈哈深胳。
WELUIMapping
代碼在這?
這玩意主要是為了去model绰疤。簡單的展示頁,都會有這么個(gè)流程舞终,把數(shù)據(jù)放到model里轻庆,緊接著再從model取出數(shù)據(jù)放到view里。干嘛要這樣折騰敛劝?直接放到View里不就好了余爆?
在這里,使用model最大好處就是替代dic[xxxx]這種代價(jià)很大的代碼夸盟,那么也就是說蛾方,能夠?qū)崿F(xiàn)不使用model,又能不用dic[xxx]這種代碼,一切就解決了不是桩砰?
準(zhǔn)備工作
很簡單拓春,用JSON字段名作為UI控件的變量名。
之后調(diào)用這個(gè)代碼亚隅。
[self mappingUIWithDictionary:jsonDic];
便完成了全部的賦值硼莽。
頭文件如下。
@interface NSObject (WELUIMapping)
-(void)mappingUIWithModel:(id)model;
-(void)mappingUIWithDictionary:(NSDictionary *)dictionary;
@end
之所以使用object分類的方式去實(shí)現(xiàn)煮纵,是為了兼容view和controller懂鸵。
對String的支持
例如。你有這么個(gè)json
{"name":"welcommand","age":"20"};
那么你需要建立這樣的ui行疏。
@property (nonatomic, strong) UILabel *name;
@property (nonatomic, strong) UILabel *age;
string的全局替換
如果你有這么個(gè)json
{"sex":"1"};
在你的項(xiàng)目中匆光,1表示男 2表示女。
可以注冊一個(gè)全局的文字解析方法酿联。
[[WELGlobalMappingRule globalRule] registerTextSplice:^NSString *(NSString *modelKey, NSString *modelValue) {
??????? if([modelKey isEqualToString:@"sex"]) {
??????????? if([modelValue isEqualToString:@"1"]) {
??????????????? return @"男";
??????????? } else {
??????????????? return @"女";
??????????? }
??????? }
??????? return nil;
??? }];
之后殴穴,你的json就相當(dāng)于變成了這樣
{"sex":"男"};
string的局部替換
如果你并不希望全局替換。那么可以在需要變化的ui類中實(shí)現(xiàn)這個(gè)協(xié)議
@protocol WELMappingCustom <NSObject>
之后 實(shí)現(xiàn)這個(gè)方法
-(NSString *)customTextSplice:(NSString *)UIkey modelValue:(NSString *)value;
圖片的支持
如果你的的控件是UIImageView或者UIButton,并且json字段的內(nèi)容是url货葬,那么便可以實(shí)現(xiàn)自動(dòng)的圖片賦值。
在這里劲够,需要你把你的圖片請求方法和url拼接方法注冊到WELGlobalMappingRule中
??? [[WELGlobalMappingRule globalRule] registerImageURLSplice:^NSString *(NSString *modelKey, NSString *subURLString) {
??????? return? [[NSString alloc] initWithFormat:@"%@%@",baseURL,subURLString];
??? }];
??? [[WELGlobalMappingRule globalRule] registerImageRequest:^(UIImageView *imageView, NSURL *URL) {
??????? // 你自己的圖片異步加載方法
??? }];
之后就可以完成自動(dòng)映射震桶。
PS,url拼接留出一個(gè)modelKey征绎,主要是防止有的接口傳回的是絕對路徑蹲姐。可以根據(jù)modelKey去判斷人柿,選擇相應(yīng)的拼接方法柴墩。
創(chuàng)建全局相等字段
主要是為了解決uid,user_id這種字段不統(tǒng)一的問題凫岖。
[[WELGlobalMappingRule globalRule] addSameMeaningKeys:@[@"user_id",@"uid"]];
加上這句話江咳,以后映射的時(shí)候,就可以將uid和user_id當(dāng)成一個(gè)字段處理哥放。
一些事件判斷
目前寫的比較簡單歼指,這個(gè)主要是考慮到,有時(shí)候我們要根據(jù)一個(gè)model中的type來改變一些布局甥雕,比如顏色踩身。我在這里留了個(gè)回調(diào),用來處理這些事情社露。同樣是實(shí)現(xiàn)WELMappingCustom協(xié)議挟阻。
-(void)customValueEvent:(NSString *)modelKey modelValue:(NSString *)modelValue;
多字段的映射。
有時(shí)候,需要把兩個(gè)字段映射到一個(gè)label中附鸽。這時(shí)候脱拼。需要實(shí)現(xiàn)WELMappingCustom中的
-(NSString *)customTextSplice:(NSString *)UIkey modelDictionary:(NSDictionary *)modelDictionary;
這個(gè)回調(diào)會把整個(gè)字段傳過來,可以在這里面進(jìn)行字符串拼接拒炎。
局限性
這個(gè)映射設(shè)計(jì)時(shí)挪拟,初衷是為了去掉簡單的model。如果你經(jīng)常會使用到后兩個(gè)回調(diào)击你,那就應(yīng)該考慮玉组,是否建立一個(gè)model是更加合適的方法。當(dāng)然丁侄,后續(xù)惯雳,我也會繼續(xù)探索,類似后兩種需求鸿摇,有沒有更加優(yōu)雅的方式去實(shí)現(xiàn)石景。
以上