Возможно, вы помещаете некоторую строку-заполнитель в свойство text
текстового поля. Обычно мы бы этого не делали. Поместите строку-заполнитель в свойство placeholder
текстового поля, и оно будет делать именно то, что вы хотите, а именно, отобразить текст-заполнитель, если он пуст, в противном случае показать, что ввел пользователь. И тогда вам не нужна эта textFieldDidBeginEditing
реализация, и ваши простые isEmpty
проверки будут работать.
Если вы хотите выполнить свой собственный процесс заполнителя вручную, используя свойство text
, тогда вы должныизмените логику проверки, проверяя как isEmpty
, так и то, что он не равен вашему заполнителю.
Например, вы можете использовать служебный метод, чтобы выяснить, что пользователь фактически ввел (т. е. если он равентекстовая строка по умолчанию, затем возвращает строку нулевой длины):
@IBAction func didTapLogin(_ sender: Any) {
let userid = actualInput(for: useridTextField, defaultText: "Enter userid")
let password = actualInput(for: passwordTextField, defaultText: "Enter password")
switch (userid.isEmpty, password.isEmpty) {
case (true, true):
AlertFun.showAlert(title: "", message: "Please enter PhoneNumber & Password", in: self)
case (true, _):
AlertFun.showAlert(title: "", message: "Please enter PhoneNumber", in: self)
case (_, true):
AlertFun.showAlert(title: "", message: "Please enter Password", in: self)
default:
logInService()
}
}
func actualInput(for textField: UITextField, defaultText: String) -> String {
let text = textField.text ?? ""
if text == defaultText {
return ""
} else {
return text.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
Лично, даже если вы используете свой собственный заполнитель в трюке text
, я все равно мог бы сохранить строку заполнителя вplaceholder
свойство удерживать это. Я мог бы также переместить это в расширение UITextField
:
extension UITextField {
var userInput: String? { text == placeholder ? "" : text }
}
Тогда вы могли бы сделать:
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var useridTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
useridTextField.placeholder = "Please enter userid"
passwordTextField.placeholder = "Please enter password"
useridTextField.text = useridTextField.placeholder
passwordTextField.text = passwordTextField.placeholder
}
@IBAction func didTapLogin(_ sender: Any) {
let userid = useridTextField.userInput ?? ""
let password = passwordTextField.userInput ?? ""
switch (userid.isEmpty, password.isEmpty) {
case (true, true):
AlertFun.showAlert(title: "", message: "Please enter PhoneNumber & Password", in: self)
case (true, _):
AlertFun.showAlert(title: "", message: "Please enter PhoneNumber", in: self)
case (_, true):
AlertFun.showAlert(title: "", message: "Please enter Password", in: self)
default:
logInService()
}
}
func logInService() { ... }
}
extension ViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField.text == textField.placeholder {
textField.text = ""
}
}
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
if textField.text?.isEmpty ?? true {
textField.text = textField.placeholder
}
}
}
Таким образом, вы избегаете посыпать ваш код строковыми литералами, даже еслипользователь нажимает на поле (где вы удаляете текст), теперь он может видеть строку-заполнитель, чтобы знать, что вводить и т. д.