【问题标题】:Limit UITextField to letters and spaces only将 UITextField 限制为仅字母和空格
【发布时间】:2020-12-13 04:31:17
【问题描述】:

我添加了一个 UITextField,我想将其限制为仅字母和空格。所以与以下;

let set = CharacterSet (charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ")

如果可能的话,我如何在不使用委托的情况下做到这一点,如果可能的话,使用 RxSwift、RxCocoa 等方法。有没有人有一个绝妙的主意?

【问题讨论】:

标签: swift xcode rx-swift rx-cocoa rx-binding


【解决方案1】:

您可以向文本字段添加事件

textField1.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

当文本发生变化时处理它

func textFieldDidChange(textField: UITextField) {
    // Check the textField text and update textField
}

【讨论】:

    【解决方案2】:

    你可以这样检查:

    func validateField(enteredString:String) -> Bool {
        
        let validationFormat = "[a-zA-Z\\s]+"
        let fieldPredicate = NSPredicate(format:"SELF MATCHES %@", validationFormat)
        return fieldPredicate.evaluate(with: enteredString)
    }
    

    并使用

    if !validateField(enteredString: textField.text ?? "") {
                
        print("Invalid String")
        return false
    }
    

    【讨论】:

      【解决方案3】:

      你可以在这里找到一个很好的 Rx 文本过滤实现: RxSwift replacement shouldChangeCharactersInRange

      在你的情况下,它应该是这样的:

      textField.rx.text.orEmpty
          .map(alphaNumericAndWhitespace)
          .subscribe(onNext: setPreservingCursor(on: textField))
          .disposed(by: bag)
      
      func alphaNumericAndWhitespace(_ text: String) -> String {
          let customSet = CharacterSet.alphanumerics.union(CharacterSet.whitespaces)
          return text.components(separatedBy: customSet.inverted).joined(separator: "")
      }
      
      func setPreservingCursor(on textField: UITextField) -> (_ newText: String) -> Void {
          return { newText in
              let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: textField.selectedTextRange!.start) + newText.count - (textField.text?.count ?? 0)
              textField.text = newText
              if let newPosition = textField.position(from: textField.beginningOfDocument, offset: cursorPosition) {
                  textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
              }
          }
      }
      

      【讨论】:

      • 我不同意。这种方法通常被接收端的人认为是敌对的,我更倾向于重复(可能)正确的答案,而不是延续一个完善的不友好的 SO 做法。
      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      相关资源
      最近更新 更多