【问题标题】:Swift - validating UITextFieldSwift - 验证 UITextField
【发布时间】:2015-10-08 07:37:47
【问题描述】:

我的应用中有这些插座:

@IBOutlet var name1: UITextField!

@IBOutlet var name2: UITextField!

@IBOutlet var name3: UITextField!

@IBOutlet var name4: UITextField!

@IBOutlet var newButton: UIButton!

我尝试做的是:

每次用户在这四个UITextFields 之一中键入内容或删除某些内容时,我想检查是否有任何UITextField 为空

如果任何UITextField 为空,则应禁用该按钮。

如果设置了所有UITextFields(非空),则应启用该按钮。

我的代码:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    setButton()

    return true
}

func setButton() {

    let inputValid = checkInput()

    if inputValid {

        newButton.enabled = true

    } else {

        newButton.enabled = false

    }

}

func checkInput() -> Bool {

    let name1Value = name1.text
    let name2Value = name2.text
    let name3Value = name3.text
    let name4Value = name4.text

    if !name1Value.isEmpty && !name2Value.isEmpty && !name3Value.isEmpty && !name4Value.isEmpty {

        return true

    }

    return false

}

好的,现在可以工作 50%。

当我在每个UITextField 中键入一个字符时,该按钮仍处于禁用状态。

当我将第二个添加到任何UITextField 时,按钮将被启用等等...

谁能帮我解决这个问题?

【问题讨论】:

    标签: swift validation uitextfield


    【解决方案1】:

    或者,您可以使用它,每次按下键时都会调用它:

    name1.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
    name2.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
    name3.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
    name4.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
    
    
    func textFieldDidChange(textField: UITextField) {
        if name1.text?.isEmpty || name2.text?.isEmpty || name3.text?.isEmpty || name4.text?.isEmpty {
            //Disable button
        } else {
            //Enable button
        }
    }
    

    【讨论】:

      【解决方案2】:

      斯威夫特 4 - 这是我解决它的方法,试图避免长条件 - 这也将允许您对每个单独的文本字段进行实时验证,与接受的答案不同,您可以根据用户输入的内容更新您的 UI。

      let textfields : [UITextField] = [name1, name2, name3, name4]
      for textfield in textfields {
        textfield.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
      }
      
      
      @objc func textFieldDidChange(_ textField: UITextField) {
        //set Button to false whenever they begin editing
        yourButton.isEnabled = false
        guard let first = textFields[0].text, first != "" else {
              print("textField 1 is empty")
              return
          }
          guard let second = textFields[1].text, second != "" else {
              print("textField 2 is empty")
              return
          }
          guard let third = textFields[2].text, third != "" else {
              print("textField 3 is empty")
              return
          }
          guard let forth = textFields[3].text, forth != "" else {
              print("textField 4 is empty")
              return
          }
          // set button to true whenever all textfield criteria is met.
          yourButton.isEnabled = true
      
      }
      

      【讨论】:

      • 这是进行验证的直接方法。使用 shouldChangeCharactersInRange 可能会遇到大量变化:用户粘贴文本、用户在文本中间输入或在文本中间删除 - 它们都必须考虑在内。但是使用 textFieldDidChange 我们只有最终结果并且可以按原样验证它。
      • 我设法通过使用let nsString = textField.text as NSString?let newString = nsString?.replacingCharacters(in: shouldChangeCharactersIn, with: replacementString) 来解决这个问题,这给了你newString。然后,您可以验证并根据需要返回 truefalse。 (来源:stackoverflow.com/questions/25138339/…
      【解决方案3】:

      textField:shouldChangeCharactersInRange: 方法在文本字段的内容发生更改之前被调用。

      您应该对当前文本字段进行特殊处理,并确定它的新内容在编辑后是否会变为空白。

      类似这样的:

      textField.text.length > range.length - replacementString.length
      

      (这不是我的想法,并且没有经过调试。另外,您必须提出确保所有其他字段都不为空的逻辑,并使用上面的逻辑来测试当前字段的内容.)

      【讨论】:

        【解决方案4】:

        看看UITextFieldValidator。我创建了一个验证器,它几乎涵盖了应用程序中所需的每个验证。它也很快。所以去看看吧。

        【讨论】:

        • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(而不是另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,保留链接作为参考
        • @iAnurag ,非常好,但是如果文本字段以数字开头但也包含字母,代码仍然会出错。那应该怎么解决呢???
        【解决方案5】:

        试试这个代码。希望你能有所收获。

        func updateSaveButtonState() {
            let text = titleTextField.text ?? ""
            saveButton.isEnabled = !text.isEmpty
        }
        
        
        @IBAction func textEditingChanged(_ sender: UITextField) {
            updateSaveButtonState()
        }
        
        @IBAction func returnPressed(_ sender: UITextField) {
            titleTextField.resignFirstResponder()
        }
        

        【讨论】:

          【解决方案6】:

          斯威夫特 4 & 5

          首先,您创建一个类似setupTextFields() 的函数,然后在viewDidLoad() 中调用它(类似这样):

          override func viewDidLoad() {
              super.viewDidLoad()
              // Do any additional setup after loading the view.
          
              setupTextFields() //You call the function here.
          }
          
          func setupTextFields() {
              name1.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
              name2.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
              name3.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
              name4.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
          }
          

          然后你创建另一个函数,每次你按下一个键,这个函数就会被调用。我将向您展示两个选项,然后您选择更适合您的选项。通常,选项 1 会被认为是 Swift 更好的实现。

          选项 1

          @objc func textFieldDidChange(_ textField: UITextField) {
              guard !name1.text!.isEmpty else {
                  button.isEnabled = false
                  return
              }
              guard !name2.text!.isEmpty else {
                  button.isEnabled = false
                  return
              }
              guard !name3.text!.isEmpty else {
                  button.isEnabled = false
                  return
              }
              guard !name4.text!.isEmpty else {
                  button.isEnabled = false
                  return
              }
              button.isEnabled = true
          }
          

          选项 2

          @objc func textFieldDidChange(_ textField: UITextField) {
              if name1.text!.isEmpty || name2.text!.isEmpty || name3.text!.isEmpty || name4.text!.isEmpty {
                  button.isEnabled = false
              } else {
                  button.isEnabled = true
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-05-28
            • 1970-01-01
            • 1970-01-01
            • 2020-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-08
            相关资源
            最近更新 更多