禁用带有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
}
}
}
为此,您可以使用文本字段委托方法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
}
}
}
不幸的是,当我在我的textFieldDidBeginEditing函数中添加相同的代码时,这并不起作用。 – davidrayowens 2014-09-23 02:18:53
在textFieldDidBeginEditing中注释您的代码并执行您的代码。 – 2014-09-23 03:16:07
请在范围方法中改变字符处的中断点,并检查这些文本字段是否为空。只需在每个文本字段中键入两个字符并删除一个文本字段文本。希望你能找到答案。 – 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()
被计算字符串的长度。
我复制并粘贴了你在这里完成的工作,但实际上它根本没有激活btnSignup。它从未重新激活。在回答时你能留下什么吗? – davidrayowens 2014-09-23 03:00:17
您是否连接了IBOutlets?您是否将标签添加到属性检查器中的文本字段? – 2014-09-23 03:02:28
是的,他们已经从头开始连接 – davidrayowens 2014-09-23 03:07:47