检查 UITextfield 是否处于活动状态
Check if UITextfield is active
问题是 "Eye Button" 应该只在文本域被选中时显示。我已经用 "isFirstResponder" 试过了,但这似乎不起作用。任何想法如何处理这个?在下面的图片中,未选择文本字段。
更新
委托函数"password did change"工作正常。我唯一需要的是,如果不再选择文本字段,按钮应该隐藏。添加委托函数 "beging" 或 "endEditing" 不起作用。如果用户输入内容,取消选择文本字段并再次选择它,它只会导致另一个失败,即文本被删除。
@IBAction func passwordDidChange(_ sender: Any) {
if self.passwordTextField.text == "" && self.passwordTextField.isFirstResponder != true{
self.eyeOpenButton.isHidden = true
}else {
self.eyeOpenButton.isHidden = false
}
你可以尝试这样的事情。
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var passwordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.eyeOpenButton.isHidden = true
passwordTextField.delegate = self
}
// calls when textfield becomes 1st responder
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
switch textField {
case passwordTextField:
if passwordTextField.text != "" {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
} else {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
break
default:
break
}
return true
}
//Calls when the text fields resigns first responder
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
if textField == passwordTextField {
if passwordTextField.text != "" {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
} else {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
}
return true
}
// Check all the input user has with the keyboard.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let passwordTextField = passwordTextField {
if passwordTextField.text?.count ?? 0 > 0 {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
if passwordTextField.text?.count == 0 {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
for textField in self.view.subviews where textField is UITextField {
textField.resignFirstResponder()
}
return true
}
}
您需要在 UITextfieldDelegate
方法中处理此问题。实施这些方法并听取变化并采取相应行动。
问题是 "Eye Button" 应该只在文本域被选中时显示。我已经用 "isFirstResponder" 试过了,但这似乎不起作用。任何想法如何处理这个?在下面的图片中,未选择文本字段。
更新
委托函数"password did change"工作正常。我唯一需要的是,如果不再选择文本字段,按钮应该隐藏。添加委托函数 "beging" 或 "endEditing" 不起作用。如果用户输入内容,取消选择文本字段并再次选择它,它只会导致另一个失败,即文本被删除。
@IBAction func passwordDidChange(_ sender: Any) {
if self.passwordTextField.text == "" && self.passwordTextField.isFirstResponder != true{
self.eyeOpenButton.isHidden = true
}else {
self.eyeOpenButton.isHidden = false
}
你可以尝试这样的事情。
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var passwordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.eyeOpenButton.isHidden = true
passwordTextField.delegate = self
}
// calls when textfield becomes 1st responder
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
switch textField {
case passwordTextField:
if passwordTextField.text != "" {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
} else {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
break
default:
break
}
return true
}
//Calls when the text fields resigns first responder
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
if textField == passwordTextField {
if passwordTextField.text != "" {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
} else {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
}
return true
}
// Check all the input user has with the keyboard.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let passwordTextField = passwordTextField {
if passwordTextField.text?.count ?? 0 > 0 {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
if passwordTextField.text?.count == 0 {
self.eyeOpenButton.isHidden = !self.eyeOpenButton.isHidden
}
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
for textField in self.view.subviews where textField is UITextField {
textField.resignFirstResponder()
}
return true
}
}
您需要在 UITextfieldDelegate
方法中处理此问题。实施这些方法并听取变化并采取相应行动。