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

Posted

技术标签:

【中文标题】在 Eureka 中向自定义规则添加规则【英文标题】:Adding a rule to a custom rule in Eureka 【发布时间】:2017-06-01 11:36:54 【问题描述】:

所以我创建了一个自定义行,它只是一个简单的UITextView 行现在我想创建一个规则,如果UITextView 的字符数少于100 个,则变量row.isValid 将评估为@987654324 @。

<<< 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

使用普通的TextRow,这将编译并且 XCode 不会抛出任何错误,尽管由于 TextViewRow 是自定义行,我相信这就是它抛出错误的原因。

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

$0.add(ruleSet: ...)

但我找不到任何文档。

我也不确定我是否能够像我一样定义我的规则,因为闭包中的rowValue 可能没有引用任何东西。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

欢迎来到 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
    

请注意,如果验证失败,对 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
    

我希望这会有所帮助,如果您对 Eureka 有任何进一步的问题,我之前已经遇到并解决了这些问题,所以请随时给我发消息。

【讨论】:

以上是关于在 Eureka 中向自定义规则添加规则的主要内容,如果未能解决你的问题,请参考以下文章

向自定义 React 组件添加额外的类名

向自定义正则表达式添加动态错误消息

向自定义CompoundButton添加涟漪效果

向自定义视图中的 UIButton 添加操作

向自定义 UIButton 添加约束不起作用

如何向自定义 UIWebview 添加“打开方式”功能?