XLForm框架學(xué)習(xí)修改筆記第二篇

整體的目錄結(jié)構(gòu)

屏幕快照 2017-04-06 上午8.45.33.png

分批次描述:


屏幕快照 2017-04-06 上午8.44.44.png

cell 文件夾

cell文件夾

沒有必要一一講述,這里就是不同元素,每個元素其實都是UITableViewCell,但是為了統(tǒng)一封裝都繼承了XLFormBaseCell,最后在統(tǒng)一繼承UITableViewCell

Controllers 文件夾

Controllers 文件夾

Descriptors(描述) 文件夾

Descriptors(描述) 文件夾

Helpers(分類) 文件夾

Helpers(分類) 文件夾

Validation(限制) 文件夾

Validation(限制)文件夾

里面可以集成對各個輸入的一些限制判斷销钝,在其中可以通過正則表達式來限制厕吉。
XLFormRegexValidator類為解析正正則表達式酱固,判斷出是否符合輸入限制,其核心代碼

-(XLFormValidationStatus *)isValid: (XLFormRowDescriptor *)row {
    if (row != nil && row.value != nil) {
        // we only validate if there is a value
        // assumption: required validation is already triggered
        // if this field is optional, we only validate if there is a value
        id value = row.value;
        if ([value isKindOfClass:[NSNumber class]]){
            value = [value stringValue];
        }
        if ([value isKindOfClass:[NSString class]] && [value length] > 0) {
            //通過謂詞這種高級特性判斷輸入內(nèi)容是否符合標準
            BOOL isValid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", self.regex] evaluateWithObject:[value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
            //將結(jié)果建立一個模型
            return [XLFormValidationStatus formValidationStatusWithMsg:self.msg status:isValid rowDescriptor:row];
        }
    }
    return nil;
};

XLFormValidationStatus 其實就是一個是否符合標準的模型头朱。
XLFormValidator判斷輸入是否符合標準的集合运悲,所有的規(guī)則都在其中編寫,可以做到很好的復(fù)用项钮。
XLFormValidatorProtocol所有的限制規(guī)則都要遵守該協(xié)議班眯。

下面簡述一個限制的判斷過程,已判斷輸入是否為郵箱為例:
首先在創(chuàng)建界面界面階段要先加上對該條的判斷規(guī)則

[row addValidator:[XLFormValidator emailValidator]];

然后再** XLFormValidator**中實現(xiàn)該方法

+(XLFormValidator *)emailValidator
{
    return [XLFormRegexValidator formRegexValidatorWithMsg:NSLocalizedString(@"郵箱地址輸入有誤", nil) regex:@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"];
}

運行時該條限定條件會添加到該元素的validators 數(shù)組中烁巫,也就是說署隘,同一個元素可以存在多條限制

-(void)addValidator:(id<XLFormValidatorProtocol>)validator
{
    if (validator == nil || ![validator conformsToProtocol:@protocol(XLFormValidatorProtocol)])
        return;

    if(![self.validators containsObject:validator]) {
        [self.validators addObject:validator];
    }
}

在提交表單的時候,可以進行檢查

    NSArray * validationErrors = [self formValidationErrors];
    if (validationErrors.count > 0){
        [self showFormValidationError:[validationErrors firstObject]];
        return;
    }

跳來跳去會跳到-(NSArray *)localValidationErrors:(XLFormViewController *)formViewController函數(shù)亚隙,內(nèi)部會把所有元素挨個遍歷一遍尋找所有的磁餐,把所有不合格的輸入都挑出來其中遍歷元素的是[row doValidation]方法

- (BOOL)valueIsEmpty
{
    return self.value == nil || [self.value isKindOfClass:[NSNull class]] || ([self.value respondsToSelector:@selector(length)] && [self.value length]==0) ||
    ([self.value respondsToSelector:@selector(count)] && [self.value count]==0);
}

-(XLFormValidationStatus *)doValidation
{
    XLFormValidationStatus *valStatus = nil;

    if (self.required) { //判斷輸入是否為必須輸入,如果為非必輸則跳過
        // do required validation here
        if ([self valueIsEmpty]) {//判斷元素是否為空
            valStatus = [XLFormValidationStatus formValidationStatusWithMsg:@"" status:NO rowDescriptor:self];
            NSString *msg = nil;
            if (self.requireMsg != nil) {
                msg = self.requireMsg;
            } else {
                // default message for required msg
                msg = NSLocalizedString(@"%@ can't be empty", nil);
            }

            if (self.title != nil) {
                valStatus.msg = [NSString stringWithFormat:msg, self.title];
            } else {
                valStatus.msg = [NSString stringWithFormat:msg, self.tag];
            }

            return valStatus;
        }
    }
    // custom validator   遍歷限制規(guī)則
    for(id<XLFormValidatorProtocol> v in self.validators) {
        if ([v conformsToProtocol:@protocol(XLFormValidatorProtocol)]) {
            XLFormValidationStatus *vStatus = [v isValid:self];//實現(xiàn)協(xié)議的方法 生成一個是否成功的模型
            // fail validation
            if (vStatus != nil && !vStatus.isValid) {
                return vStatus;
            }
            valStatus = vStatus;
        } else {
            valStatus = nil;
        }
    }
    return valStatus;
}

根據(jù)這一些列操作就可以判斷出是否輸入是否符合限制

/**
 遍歷所有元素返回不符合輸入規(guī)則的元素阿弃,并且返回相應(yīng)的錯誤信息

 @param formViewController formViewController description
 @return return value description
 */
-(NSArray *)localValidationErrors:(XLFormViewController *)formViewController {
    NSMutableArray * result = [NSMutableArray array];
    for (XLFormSectionDescriptor * section in self.formSections) {
        for (XLFormRowDescriptor * row in section.formRows) {
            XLFormValidationStatus* status = [row doValidation];
            if (status != nil && (![status isValid])) {
                NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: status.msg,
                                            XLValidationStatusErrorKey: status };
                NSError * error = [[NSError alloc] initWithDomain:XLFormErrorDomain code:XLFormErrorCodeGen userInfo:userInfo];
                if (error){
                    [result addObject:error];
                }
            }
        }
    }
    
    return result;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诊霹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渣淳,更是在濱河造成了極大的恐慌脾还,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件水由,死亡現(xiàn)場離奇詭異荠呐,居然都是意外死亡赛蔫,警方通過查閱死者的電腦和手機砂客,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呵恢,“玉大人鞠值,你說我怎么就攤上這事∩ぃ” “怎么了彤恶?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鳄橘。 經(jīng)常有香客問我声离,道長,這世上最難降的妖魔是什么瘫怜? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任术徊,我火速辦了婚禮,結(jié)果婚禮上鲸湃,老公的妹妹穿的比我還像新娘赠涮。我一直安慰自己子寓,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布笋除。 她就那樣靜靜地躺著斜友,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垃它。 梳的紋絲不亂的頭發(fā)上鲜屏,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音嗤瞎,去河邊找鬼墙歪。 笑死,一個胖子當著我的面吹牛贝奇,可吹牛的內(nèi)容都是我干的虹菲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掉瞳,長吁一口氣:“原來是場噩夢啊……” “哼毕源!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陕习,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霎褐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后该镣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻璃,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年损合,在試婚紗的時候發(fā)現(xiàn)自己被綠了省艳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫁审,死狀恐怖跋炕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情律适,我是刑警寧澤辐烂,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站捂贿,受9級特大地震影響纠修,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厂僧,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一扣草、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦德召、人聲如沸白魂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽福荸。三九已至,卻和暖如春肴掷,著一層夾襖步出監(jiān)牢的瞬間敬锐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工呆瞻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留台夺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓痴脾,卻偏偏與公主長得像颤介,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赞赖,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理滚朵,服務(wù)發(fā)現(xiàn),斷路器前域,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 《ilua》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 10,739評論 0 11
  • 《ijs》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,151評論 0 7
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,168評論 2 33
  • @(Processing學(xué)習(xí)日記) point(x,y):直接指定一個點的位置辕近,接收的是float類型 line(...
    鋼筆先生閱讀 917評論 0 1