在Eureka中向自定义规则添加规则

Yel*_*low 2 swift eureka-forms

因此,我创建了一个自定义行,该行只是一个带有简单行的行,UITextView现在我想创建一个规则,使得如果UITextView小于100个字符,则该变量的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
}
Run Code Online (Sandbox Code Playgroud)

使用正常模式,TextRow它将编译并且XCode不会引发任何错误,尽管由于TextViewRow是自定义行,所以我相信这就是为什么它引发错误的原因。

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

$0.add(ruleSet: ...)

但我找不到任何文档。

另外,我不确定是否可以像以前那样定义规则,因为rowValue闭包中的可能没有引用任何内容。我该如何解决这个问题?

Jac*_*ing 6

欢迎来到Eureka的世界,%&* @有关任何内容的所有文档。我最近喜欢尤里卡(Eureka),并开始将我的项目转换为尤里卡(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
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果验证失败,则对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
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这能有所帮助,如果您对Eureka有任何进一步的问题,我很可能曾经遇到并解决过,请随时向我发送消息。