禁用带有textFieldDidBeginEditing的UIButton需要单击UITextField才能生效

问题描述:

对于UITextFieldDelegate,我将根据3 UITextFields是否包含信息来禁用我的UIButton“btnSignup”。目前,它适用于减去UIButton被动(再次运行if声明)的事实,我必须点击UITextField。当我输入某些内容并且回去删除它时也是如此。直到我点击UITextField的关UIButton保持有效(如果我点击提交没有点击其他地方,我能够提交,这不应该是这样。)禁用带有textFieldDidBeginEditing的UIButton需要单击UITextField才能生效

class MainVC: UIViewController, UITextFieldDelegate { 

    @IBOutlet var receiveName: UITextField! 
    @IBOutlet var receiveEmail: UITextField! 
    @IBOutlet var receivePhone: UITextField! 
    @IBOutlet var btnSignup: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.btnSignup.enabled = false 
     self.btnSignup.alpha = 0.3 

     self.receiveName.delegate = self 
     self.receiveEmail.delegate = self 
     self.receivePhone.delegate = self 

    func textFieldDidBeginEditing(textField: UITextField) { 

     if countElements(receiveName.text) > 0 && countElements(receiveEmail.text) > 0 && countElements(receivePhone.text) > 0 { 
      self.btnSignup.enabled = true 
      self.btnSignup.alpha = 1 
     } else { 
      self.btnSignup.enabled = false 
      self.btnSignup.alpha = 0.3 
     } 
    } 
} 

我要寻找一个解决方案,让更实时的效果。如果在编辑UITextField的任何时候,该函数应该在监听并响应。

用接近你的代码的东西,我可以如下做到这一点。我增加了3个职业等级。要记录文本字段是否有输入内容的变量。我给文本字段添加了标签。我更改了UITextFieldDelegate类的func,并测试了所有三个字段都有文本。第二个你在第三个字段中输入一个字段,该按钮点亮!

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 
    var receiveNameBool = false 
    var receiveEmailBool = false 
    var receivePhoneBool = false 

    @IBOutlet var receiveName: UITextField! 
    @IBOutlet var receiveEmail: UITextField! 
    @IBOutlet var receivePhone: UITextField! 
    @IBOutlet var btnSignup: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.btnSignup.enabled = false 
     self.btnSignup.alpha = 0.3 

     self.receiveName.delegate = self 
     self.receiveEmail.delegate = self 
     self.receivePhone.delegate = self 

     } 

    func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { 

     if textField.tag == 1 { 
      receiveNameBool = true 
     } else if textField.tag == 2 { 
      receiveEmailBool = true 
     } else if textField.tag == 3 { 
      receivePhoneBool = true 
     } 

     if receiveNameBool && receiveEmailBool && receivePhoneBool { 
      self.btnSignup.enabled = true 
      self.btnSignup.alpha = 1 
     } else { 
      self.btnSignup.enabled = false 
      self.btnSignup.alpha = 0.3 
     } 
     return true 
    } 
} 

好的,在这第二个版本中,我使用了你使用的textFieldDidBeginEditing func。在这种情况下,您点击第三个字段内的第二个按钮已启用。在这两个示例中,如果用户删除他们输入的数据,您仍需编写代码来处理这种情况。但上面的第一个例子让你得到你想要的。

进口的UIKit

class ViewController: UIViewController, UITextFieldDelegate { 
    var receiveNameBool = false 
    var receiveEmailBool = false 
    var receivePhoneBool = false 

    @IBOutlet var receiveName: UITextField! 
    @IBOutlet var receiveEmail: UITextField! 
    @IBOutlet var receivePhone: UITextField! 
    @IBOutlet var btnSignup: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.btnSignup.enabled = false 
     self.btnSignup.alpha = 0.3 

     self.receiveName.delegate = self 
     self.receiveEmail.delegate = self 
     self.receivePhone.delegate = self 

     } 

    func textFieldDidBeginEditing(textField: UITextField) { 

     if textField.tag == 1 { 
      receiveNameBool = true 
     } else if textField.tag == 2 { 
      receiveEmailBool = true 
     } else if textField.tag == 3 { 
      receivePhoneBool = true 
     } 

     if receiveNameBool && receiveEmailBool && receivePhoneBool { 
      self.btnSignup.enabled = true 
      self.btnSignup.alpha = 1 
     } else { 
      self.btnSignup.enabled = false 
      self.btnSignup.alpha = 0.3 
     } 
    } 
} 
+0

我复制并粘贴了你在这里完成的工作,但实际上它根本没有激活btnSignup。它从未重新激活。在回答时你能留下什么吗? – davidrayowens 2014-09-23 03:00:17

+0

您是否连接了IBOutlets?您是否将标签添加到属性检查器中的文本字段? – 2014-09-23 03:02:28

+0

是的,他们已经从头开始连接 – davidrayowens 2014-09-23 03:07:47

为此,您可以使用文本字段委托方法stringByReplacingCharactersInRange

enum tags: Int{ 

case receiveNameTag = 1, receiveEmailTag, receivePhoneTag 


} 

进口的UIKit

类的ViewController:UIViewController中,UITextFieldDelegate {

@IBOutlet var receiveName: UITextField! 
@IBOutlet var receiveEmail: UITextField! 
@IBOutlet var receivePhone: UITextField! 
@IBOutlet var btnSignup: UIButton! 

// here first assign the true because all the textfields are empty 
var isReceiveNameTextFieldEmpty = true 
var isReceiveEmailTextFieldEmpty = true 
var isReceivePhoneTextFieldEmpty = true 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.btnSignup.enabled = false 
    self.btnSignup.alpha = 0.3 


    //here adding tags to the individual textfield and this is the best way to use tags 
    receiveName.tag = tags.receiveNameTag.toRaw() 
    receiveEmail.tag = tags.receiveEmailTag.toRaw() 
    receivePhone.tag = tags.receivePhoneTag.toRaw() 

    self.receiveName.delegate = self 
    self.receiveEmail.delegate = self 
    self.receivePhone.delegate = self 

} 

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { 

    textField.text = (textField.text as NSString).stringByReplacingCharactersInRange(range, 
     withString:string) 

    //checking whether textfield is empty or not 
    if countElements(textField.text) > 0 { 

     if textField.tag == tags.receiveNameTag.toRaw() { 
      isReceiveNameTextFieldEmpty = false 
     } 
     if textField.tag == tags.receiveEmailTag.toRaw() { 
      isReceiveEmailTextFieldEmpty = false 
     } 
     if textField.tag == tags.receivePhoneTag.toRaw() { 
      isReceivePhoneTextFieldEmpty = false 
     } 

    } 
    else { 

     if textField.tag == tags.receiveNameTag.toRaw() { 
     isReceiveNameTextFieldEmpty = true 
     } 
     if textField.tag == tags.receiveEmailTag.toRaw() { 
      isReceiveEmailTextFieldEmpty = true 
     } 
     if textField.tag == tags.receivePhoneTag.toRaw() { 
      isReceivePhoneTextFieldEmpty = true 
     } 

    } 

    //if atleast one textfield is empty disable button other wise enable 
    if isReceiveNameTextFieldEmpty && isReceiveEmailTextFieldEmpty && isReceivePhoneTextFieldEmpty { 
     self.btnSignup.enabled = false 
     self.btnSignup.alpha = 0.3 
    } 
    else { 
     self.btnSignup.enabled = true 
     self.btnSignup.alpha = 1 
    } 


} 

}

+0

不幸的是,当我在我的textFieldDidBeginEditing函数中添加相同的代码时,这并不起作用。 – davidrayowens 2014-09-23 02:18:53

+0

在textFieldDidBeginEditing中注释您的代码并执行您的代码。 – 2014-09-23 03:16:07

+0

请在范围方法中改变字符处的中断点,并检查这些文本字段是否为空。只需在每个文本字段中键入两个字符并删除一个文本字段文本。希望你能找到答案。 – 2014-09-23 03:30:43

我也有类似的问题,我的应用程序之一。它发生在我身上,因为委托在后台线程上调用,不会立即更新视图。您需要将所有UI更改同步到主线程。请参见下面的代码:

class MainVC: UIViewController, UITextFieldDelegate { 

    @IBOutlet var receiveName: UITextField! 
    @IBOutlet var receiveEmail: UITextField! 
    @IBOutlet var receivePhone: UITextField! 
    @IBOutlet var btnSignup: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.btnSignup.enabled = false 
     self.btnSignup.alpha = 0.3 

     self.receiveName.delegate = self 
     self.receiveEmail.delegate = self 
     self.receivePhone.delegate = self 

    func textFieldDidBeginEditing(textField: UITextField) { 
     dispatch_sync(dispatch_get_main_queue(), { 
      if countElements(self.receiveName.text) > 0 && countElements(self.receiveEmail.text) > 0 && countElements(self.receivePhone.text) > 0 { 
       self.btnSignup.enabled = true 
       self.btnSignup.alpha = 1 
      } else { 
       self.btnSignup.enabled = false 
       self.btnSignup.alpha = 0.3 
      } 
     }) 
    } 
} 

另外,如果您countElements功能是本地的类,在电话前加上一个self.

它可以通过textField(_:shouldChangeCharactersInRange:replacementString:) 只是定义与界定这种方法如下解决:

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool { 

     if countElements(receiveName.text) > 0 && countElements(receiveEmail.text) > 0 && countElements(receivePhone.text) > 0 { 
      self.btnSignup.enabled = true 
      self.btnSignup.alpha = 1 
     } else { 
      self.btnSignup.enabled = false 
      self.btnSignup.alpha = 0.3 
     } 
     return true 
    } 

,我认为countElements()被计算字符串的长度。