在 Eureka 中向自定义规则添加规则
Adding a rule to a custom rule in Eureka
所以我创建了一个自定义行,它只是一个带有简单 UITextView
的行,现在我想创建一个规则,如果 UITextView
少于 100 个字符,则变量 row.isValid
将计算为 false
.
<<< TextViewRow("About Me") {
let cell = [=10=].baseCell as! TextViewCell
cell.textView.text = currentUser.aboutMe
[=10=].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
}
}
[=10=].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)
}
[=10=].add(rule: ruleRequiredViaClosure)
[=10=].validationOptions = .validatesOnDemand
}
使用正常的 TextRow
这会编译并且 XCode 不会抛出任何错误,尽管因为 TextViewRow
是一个自定义行我相信这就是它抛出错误的原因.
它给我的错误是我需要使用:
[=17=].add(ruleSet: ...)
但我找不到任何关于它的文档。
我也不确定我是否能够像我那样定义我的规则,因为闭包中的 rowValue
可能没有引用任何东西。我该如何解决这个问题?
欢迎来到 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 的调用只是 returns 一个错误字符串,否则为零。
但是,在您开始创建自定义规则之前,必须注意 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 有任何进一步的问题,我之前可能遇到过并解决过这些问题,请随时给我发消息。
所以我创建了一个自定义行,它只是一个带有简单 UITextView
的行,现在我想创建一个规则,如果 UITextView
少于 100 个字符,则变量 row.isValid
将计算为 false
.
<<< TextViewRow("About Me") {
let cell = [=10=].baseCell as! TextViewCell
cell.textView.text = currentUser.aboutMe
[=10=].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
}
}
[=10=].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)
}
[=10=].add(rule: ruleRequiredViaClosure)
[=10=].validationOptions = .validatesOnDemand
}
使用正常的 TextRow
这会编译并且 XCode 不会抛出任何错误,尽管因为 TextViewRow
是一个自定义行我相信这就是它抛出错误的原因.
它给我的错误是我需要使用:
[=17=].add(ruleSet: ...)
但我找不到任何关于它的文档。
我也不确定我是否能够像我那样定义我的规则,因为闭包中的 rowValue
可能没有引用任何东西。我该如何解决这个问题?
欢迎来到 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 的调用只是 returns 一个错误字符串,否则为零。
但是,在您开始创建自定义规则之前,必须注意 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 有任何进一步的问题,我之前可能遇到过并解决过这些问题,请随时给我发消息。