将规则添加到Eureka中的自定义规则

时间:2017-06-01 11:36:55

标签: swift eureka-forms

所以我创建了一个自定义行,它只是一行只有一个UITextView现在我想创建一个规则,如果UITextView的字符数少于100个,那么变量{{1} }将评估为row.isValid

false

使用正常<<< TextViewRow("About Me") { let cell = $0.baseCell as! TextViewCell cell.textView.text = currentUser.aboutMe $0.disabled = Condition.function([]) { form in print("in disabled") let section = form.sectionBy(tag: "About Me") let view = section!.header?.viewForSection(section!, type: .header) as! TitleHeaderView if view.isLocked { return true } else { return false } } $0.cellUpdate({ (cell, row) in if row.isDisabled { cell.textView.isUserInteractionEnabled = false cell.textView.textColor = UIColor.gray } else { cell.textView.isUserInteractionEnabled = true cell.textView.textColor = UIColor.black } }) let ruleRequiredViaClosure = RuleClosure<String> { rowValue in guard let rowValue = rowValue else { return(ValidationError(msg : "Please write more!")) } let numberOfCharacters = rowValue.characters.count return (numberOfCharacters < 250 ? ValidationError(msg: "Please write more!") : nil) } $0.add(rule: ruleRequiredViaClosure) $0.validationOptions = .validatesOnDemand } 这将编译并且XCode不会抛出任何错误,但由于TextRow是自定义行,我相信这就是它抛出错误的原因。

它给我的错误是我需要使用:

TextViewRow

但我找不到任何文件。

此外,我不确定我是否能够像我一样定义我的规则,因为闭包中的$0.add(ruleSet: ...)可能没有引用任何内容。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

欢迎来到Eureka的世界,%&amp; * @所有关于任何事情的文档。我最近喜欢Eureka,并开始将我的项目转换为它,一路上我遇到了许多障碍,如果文档很好,很容易避免。幸运的是,自定义验证规则是一个这样的障碍;我的实现如下:

struct RulePassword<T: Equatable>:RuleType {

    public init() {}

    public var id: String?
    public var validationError: ValidationError = ValidationError(msg: "Invalid password.")

    public func isValid(value: T?) -> ValidationError? {
        if let str = value as? String {
            let errorMsg = RGOValidationHelper.passwordValidation(str)
            return errorMsg != nil ? ValidationError(msg: errorMsg!) : nil
        }
        return validationError
    }
}

请注意,对RGOValidationHelper的调用只会在验证失败时返回错误字符串,否则返回nil。

在开始创建自定义规则之前,必须注意Eureka实际上包含了在字段上设置最小长度的工具。 RuleMinLength是规则的名称,可以通过传入最小长度的值来初始化,在您的情况下为100.这是Eureka对规则的实现:

public struct RuleMinLength: RuleType {

    let min: UInt

    public var id: String?
    public var validationError: ValidationError

    public init(minLength: UInt, msg: String? = nil){
        let ruleMsg = msg ?? "Field value must have at least \(minLength) characters"
        min = minLength
        validationError = ValidationError(msg: ruleMsg)
    }

    public func isValid(value: String?) -> ValidationError? {
        guard let value = value else { return nil }
        return value.characters.count < Int(min) ? validationError : nil
    }
}

我希望这会有所帮助,如果你对尤里卡有任何进一步的问题,我之前会遇到并解决它们,所以请随时给我发消息。