swift - 验证UITextField

时间:2015-07-18 20:18:07

标签: swift validation uitextfield

我的应用程序中有这个出口:

@IBOutlet var name1: UITextField!

@IBOutlet var name2: UITextField!

@IBOutlet var name3: UITextField!

@IBOutlet var name4: UITextField!

@IBOutlet var newButton: UIButton!

我尝试做的是以下内容:

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

如果任何文本字段为空,则应禁用该按钮。

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

我的代码:

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

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

当我向任何文本字段添加第二个时,按钮会启用等...

任何人都可以帮我这个吗?

问候和感谢!

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

Swift 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

}

答案 2 :(得分:0)

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

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

这样的事情:

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

(那是我的头脑,而不是调试。另外,你必须提出逻辑,确保所有其他字段都是非空白的,并使用上面的逻辑来测试内容当前领域。)

答案 3 :(得分:0)

看看UITextFieldValidator。我创建了一个验证器,几乎涵盖了应用程序中所需的每个验证。它也很迅速。所以继续检查一下。

答案 4 :(得分:0)

试试这段代码。希望你能做什么。

func updateSaveButtonState() {
    let text = titleTextField.text ?? ""
    saveButton.isEnabled = !text.isEmpty
}


@IBAction func textEditingChanged(_ sender: UITextField) {
    updateSaveButtonState()
}

@IBAction func returnPressed(_ sender: UITextField) {
    titleTextField.resignFirstResponder()
}