【问题标题】:Check if UITextField is empty or not on viewDidLoad and enable button检查 viewDidLoad 上的 UITextField 是否为空并启用按钮
【发布时间】:2016-12-28 19:22:21
【问题描述】:

我在 ViewController 中有多个 UItextField。我也有来自情节提要的出口功能来检查文本字段是否为空,并且我仅在文本字段非空时启用按钮。

对于一些文本字段,我在 viewDidLoad 之前设置数据,因此用户不必手动输入它。即使这些文本字段有数据,也必须单击它们一次才能启用按钮。

var isFirstNameValid = false
@IBAction func validateFirstName(sender: AnyObject) {
        guard (!firstNameText.text!.isEmpty) else{
            isFirstNameValid = false
            return
        }
        isFirstNameValid = true
        enableRegisterButton()
    }


func enableRegisterButton()
    {
        guard (isFirstNameValid) else{
            registerButton.enabled = false
            return
        }
        registerButton.enabled = true
    }

当文本字段有用户输入的数据或在 viewDidLoad 方法之前以编程方式设置时,我想启用按钮。

【问题讨论】:

  • 当用户加载视图控制器时,填充文本字段的数据来自哪里?
  • 我有一个存储 coreLocation 数据的结构,我试图填写地址的文本字段。
  • 为什么不将检查填充文本字段的代码放在 viewDidLoad 中并在此处启用按钮
  • 我想即时验证一些文本字段,例如,如果用户输入了正确的电子邮件 ID
  • 那么,究竟是什么不起作用?始终启用按钮,还是仅在文本字段在没有用户干预的情况下预填充时启用?

标签: ios swift uibutton uitextfield


【解决方案1】:

您的代码看起来不错,但我认为您需要尝试替换它:

@IBAction func validateFirstName(sender: AnyObject) {
    guard (!firstNameText.text!.isEmpty) else{
        isFirstNameValid = false
        return
    }
    isFirstNameValid = true
    enableRegisterButton()
}

@IBAction func validateFirstName(sender: AnyObject) {
    isFirstNameValid = !firstNameText.text!.isEmpty
    enableRegisterButton()
}

或:

您可以在连接检查器中检查Value Changed 事件并添加方法。

即使它不起作用,您也可以在viewWillAppear() 方法中检查您的数据值:

override func viewWillAppear(animated: Bool) {
    registerButton.enabled = !firstNameText.text!.isEmpty
}

【讨论】:

  • 即使在添加值更改事件之后,按钮也不会启用。但是,如果我在启用按钮后单击文本字段。我希望在已经设置文本字段值并且用户能够在文本字段中看到数据时启用按钮
  • 您还可以在viewWillAppear() 方法中使用断点检查文本字段中的文本。但是,您只想在文本字段中有文本时启用一个按钮?对吗?
【解决方案2】:

试试这个。但是正如你所说的“当文本字段有用户输入的数据时”所以你不能在 viewDidLoad 之前这样做。我认为你应该解释更多。

textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

func textFieldDidChange(textField: UITextField) {
    //your code.enable your button here
}

【讨论】:

    【解决方案3】:

    在 viewDidLoad() 中验证所有文本字段一次并尝试启用注册按钮。这种方式注册按钮将被启用,即使所有文本字段都已预先填写,而无需您单击其中任何一个 像这样:

    isFirstNameValid = !firstNameText.text!.isEmpty
    isLastNameValid = !lastNameText.text!.isEmpty
    // rest of the fileds...
    enableRegisterButton()
    

    【讨论】:

      【解决方案4】:

      您的验证代码需要在没有用户交互的情况下运行,执行此操作的最佳位置是viewDidLoad。创建一个检查器函数,它将 UITextField 作为其参数并进行实际检查。这样一来,您就可以在 viewDidLoad 以及稍后在您的 IBAction 或任何地方验证实际用户输入时调用该检查器函数。

      override func viewDidLoad() {
          super.viewDidLoad()
      
          // This is where your code to set firstNameText goes
      
          let isFirstNameValid = checker(firstNameText)
      
          myButton.enabled = false
          if isFirstNameValid { registerButton.enabled = true }
      }
      
      func checker(textField: UITextField) -> Bool {
          guard (!textField.text!.isEmpty) else {
              return false
          }
          return true
      }
      

      旁注

      enableRegisterButton() 函数是无关的。您已经完成了开始调用函数的检查,因此检查enableRegisterButton 中的名字是否有效是多余的。该函数中唯一有用的行是registerButton.enabled = true,我们可以完全不使用该函数来编写它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-08
        • 2012-09-27
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2021-04-11
        相关资源
        最近更新 更多