在uitextfield中编辑文本时如何调用函数

Posted

技术标签:

【中文标题】在uitextfield中编辑文本时如何调用函数【英文标题】:How to call function when editing text inside of uitextfield 【发布时间】:2020-07-26 18:33:49 【问题描述】:

所以我的应用中有一个登录屏幕。当用户单击登录时,会调用一个 api 来检查登录凭据是否正确(或不正确),当登录凭据不正确时会显示错误消息。现在我遇到的问题是在调用登录按钮并显示错误消息之后,我希望当用户开始更改用户名/密码字段(UITextField)中的文本时错误消息消失。起初,我尝试使用事件侦听器尝试在侦听器调用函数时将错误消息的 alpha 设置为 0.0。我使用的代码在下面。

textField.addTarget(self, action: #selector(textFieldDidChange(textfield:)), for: .editingChanged)

然后我有一个用于该操作的 objc 函数:

@objc func textFieldDidChange(textfield: UITextField) 
        errorLabel.alpha = 0.0
    

我遇到的问题是,当用户仅单击文本字段时,错误消息就会消失。如果用户实际更改了文本字段中的文本,我只希望错误消息消失。我该怎么办?如果您还需要什么,请告诉我。

【问题讨论】:

您可以使用UITextFieldDelegate,保留一个布尔值,并在此基础上在委托方法beginEditing 中隐藏错误消息。 检查 textField.text 是否等于不正确的文本 是的 Leo Dabus 的评论有效,但我在多个地方都遇到过这个问题,我想知道是否有更简单的方法可以做到这一点,或者我是否可以制作一些可重用的类,而不是检查输入每次的文本字段。 【参考方案1】:

我写了一个快速版本的代码

解决方案是创建 2 个变量,这些变量将在您的凭据错误时存储它们的值

import UIKit

class ViewController: UIViewController 
    
 var usernameText:String? = nil
    var passwordText:String? = nil
   // we will use usernameText and PasswordText to keep track of the value of the textFields
    
    let usernameField:UITextField = 
        let textfield = UITextField()
        textfield.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
        return textfield
    ()
    let passwordField:UITextField = 
        let textfield = UITextField()
        textfield.addTarget(self, action:  #selector(textFieldDidChange), for: .editingChanged)
        return textfield
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
    

      @objc func loginButtonTouched()
           if we touch your login button and the credentials are wrong 
        // you will show the errorLabel
         
        ErrorLabel.alpha = 1
        // and give value to usernameText and passwordText
        usernameText = usernameField.text
        passwordText = passwordField.text
        else
           present(nextVC) // for example
          
    

 // the username and the password textField have the same action if the text change
      @objc func textFieldDidChange(_ textfield: UITextField) 
        // now we will use the values we gave to usernameText and passwordText to check if one of them has changed their value
        if usernameText != usernameField.text || passwordText != passwordField.text 
            // if one of them changed their value we make disappear the errorLabel
            ErrorLabel.alpha = 0.0
        
      
        
      





【讨论】:

以上是关于在uitextfield中编辑文本时如何调用函数的主要内容,如果未能解决你的问题,请参考以下文章

自动更正文本时,UITextField 未调用 editorChanged 事件

UITextField在开始编辑时具有“清除”按钮大小

在UITextField中禁用放大镜

如何在键入时使 UITextField 宽度调整为文本?

如何使 UIButton 导致 UITextField 开始编辑文本

编辑时如何更改 UITextField