Search code examples
iosswifteureka-forms

How can I validate an object like textfield in a custom Eureka row?


I have use Eureka framework to create a simple custom row, But validation not work, how can I validate the textfield inside that row ? I have researched on Google but nothing can help. Can anyone give me some help ?

public class TitleAndTextFieldCellModel: NSObject {

  // MARK: - Variable
  public var title: String = ""
  public var placeHolder: String = ""
  public var inputValue: String = ""
  public var object: Any?

  // MARK: - Init
  public init(title: String, placeHolder: String = "", inputValue: String = "", object: Any? = nil) {
    self.title = title
    self.placeHolder = placeHolder
    self.inputValue = inputValue
    self.object = object
  }
}

public class TitleAndTextFieldCell: Cell<TitleAndTextFieldCellModel>, CellType {

  // MARK: - Outlets
  @IBOutlet weak public var titleLabel: UILabel!
  @IBOutlet weak public var inputTextField: UITextField!

  override public func setup() {
    super.setup()
    selectionStyle = .none
    inputTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
  }

  override public func update() {
    super.update()
    if let model = row.value {
      titleLabel.text = model.title
      inputTextField.placeholder = model.placeHolder
      inputTextField.text = model.inputValue
    }
  }

  @objc func textFieldDidChange(_ textField: UITextField) {
    self.row.value?.inputValue = textField.text ?? ""
  }
}

final public class TitleAndTextFieldRow: Row<TitleAndTextFieldCell>, RowType {
  required public init(tag: String?) {
    super.init(tag: tag)
    cellProvider = CellProvider<TitleAndTextFieldCell>(nibName: "TitleAndTextFieldCell")
  }
}

And this is how I use:

<<< TitleAndTextFieldRow() {
            $0.value = TitleAndTextFieldCellModel(title: "Name")
            $0.add(rule: RuleRequired(msg: "Field required"))
            $0.validationOptions = .validatesOnChangeAfterBlurred
            }.cellUpdate({ (cell, row) in
              if !row.isValid {
                cell.inputTextField.layer.borderWidth = 1
                cell.inputTextField.layer.borderColor = UIColor.red.cgColor
              }
            })

Solution

  • I think I found the answer by myself. For those who need please do something like the code below:

    @objc func textFieldDidChange(_ textField: UITextField) {
        if textField.text == "" {
          self.row.validationErrors.append(ValidationError(msg: "Required"))
          self.row.validate()
        }
        self.row.value?.inputValue = textField.text ?? ""
      }