在 Xcode 中禁用/启用按钮
Disable / Enable a button in Xcode
嗨,我是 Swift 编程新手。
我想做的是在 viewDidLoad 中禁用我的按钮(登录),并且仅在文本字段中包含文本时才启用。这是我到目前为止所取得的成就。 (虽然不多!)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
signIn.isEnabled = false
// Do any additional setup after loading the view, typically from a nib.
}
@IBOutlet weak var emailtxt: UITextField!
@IBOutlet weak var passwordtxt: UITextField!
@IBOutlet weak var signIn: UIButton!
我需要帮助在 signIn 中创建一个功能,该功能使按钮保持禁用状态,直到文本字段(emailtxt 和 passwordtxt)中有文本,然后继续。
很高兴有人能帮我分类。
提前致谢!
像这样将 ViewController
设置为 emailtxt
和 passwordtxt
的代表,
override func viewDidLoad() {
super.viewDidLoad()
signIn.isEnabled = false
emailtxt.delegate = self
passwordtxt.delegate = self
// Do any additional setup after loading the view, typically from a nib.
}
当文本输入完成时,将您的 ViewController
与 UITextFieldDelegate
和 enable/disable 一致,
extension ViewController: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
if emailtxt.text?.isEmpty == false && passwordtxt.text?.isEmpty == false {
signIn.isEnabled = true
} else {
signIn.isEnabled = false
}
}
}
这是您共享的代码的修复程序。
import UIKit
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
extension SignInVC: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
if emailtxt.text?.isEmpty == false && passwordtxt.text?.isEmpty == false {
signIn.isEnabled = true
} else {
signIn.isEnabled = false
}
}
}
class SignInVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
signIn.isEnabled = false
emailtxt.delegate = self
passwordtxt.delegate = self
self.hideKeyboardWhenTappedAround()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBOutlet weak var emailtxt: UITextField!
@IBOutlet weak var passwordtxt: UITextField!
@IBOutlet weak var signIn: UIButton!
}
使用SwiftValidator
https://github.com/SwiftValidatorCommunity/SwiftValidator
这样,您将像下面这样设置电子邮件和密码的验证
import SwiftValidator
let validator = Validator()
validator.registerField(emailTextField, errorLabel: emailErrorLabel, rules: [RequiredRule(), EmailRule(message: "Invalid email")])
// MARK: - ValidationDelegate
extension ViewController: ValidationDelegate {
func validationSuccessful() {
self.loginUser()
}
func validationFailed(_ errors:[(Validatable ,ValidationError)]) {
for (field, error) in errors {
//Handle as per need - show extra label - shake view etc
/*
if let field = field as? UITextField {
Utilities.shakeTheView(shakeView: field)
}
error.errorLabel?.text = error.errorMessage
error.errorLabel?.isHidden = false
*/
}
}
}
首先为 viewDidLoad()
中的所有文本字段添加这些:
emailtxt.addTarget(self, action: #selector(textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
passwordtxt.addTarget(self, action: #selector(textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
然后使用这个:
@objc func textFieldDidChange(_ textField: UITextField) {
self.buttonIsEnabled()
}
func buttonIsEnabled() {
var buttonIsEnabled = true
defer {
self.signIn.isEnabled = buttonIsEnabled
}
guard let emailtxt = self.emailtxt.text, !emailtxt.isEmpty else {
addButtonIsEnabled = false
return
}
guard let passwordtxt = self. passwordtxt.text, ! passwordtxt.isEmpty else {
addButtonIsEnabled = false
return
}
}
我在我的代码中使用这种方式并且效果很好。
甚至您可以添加更多方法来对 buttonIsEnabled 进行额外检查,例如:
self.checkEmailIsValid(for: emailtxt)
当然你应该先处理这个方法:
func checkEmailIsValid(for: String) {
//...
}
我要做的是从您的一个文本字段创建一个 IBAction,并将事件设置为 Editing Changed
:
代码应如下所示:
@IBAction func textFieldEditingDidChange(_ sender: UITextField) {
}
然后您可以通过从插座拖动到您的剩余字段,将同一个插座连接到您的两个文本字段。如果两者都正确连接,单击 IBAction 左侧的圆圈应该会显示两个文本字段:
现在,每当您的 字段中的文本发生变化时,都会触发该操作。
然后,在文件的顶部,我将创建一个 属性 的计算结果 returns false 除非两个字段中都有内容:
var shouldEnableButton: Bool {
guard let text1 = textField1.text, let text2 = textField2.text else {
return false
}
return text1.isEmpty && text2.isEmpty ? false : true
}
最后,我们将 shouldEnableButton
添加到我们的 IBAction 中:
@IBAction func textFieldEditingDidChange(_ sender: UITextField) {
button.isEnabled = shouldEnableButton
}
重要
当您将第二个文本字段连接到插座时,它会错误地将 Editing Did End
指定为其事件:
删除此事件并单击并从 Editing Changed
拖动到您的 IBAction:
嗨,我是 Swift 编程新手。 我想做的是在 viewDidLoad 中禁用我的按钮(登录),并且仅在文本字段中包含文本时才启用。这是我到目前为止所取得的成就。 (虽然不多!)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
signIn.isEnabled = false
// Do any additional setup after loading the view, typically from a nib.
}
@IBOutlet weak var emailtxt: UITextField!
@IBOutlet weak var passwordtxt: UITextField!
@IBOutlet weak var signIn: UIButton!
我需要帮助在 signIn 中创建一个功能,该功能使按钮保持禁用状态,直到文本字段(emailtxt 和 passwordtxt)中有文本,然后继续。
很高兴有人能帮我分类。 提前致谢!
像这样将 ViewController
设置为 emailtxt
和 passwordtxt
的代表,
override func viewDidLoad() {
super.viewDidLoad()
signIn.isEnabled = false
emailtxt.delegate = self
passwordtxt.delegate = self
// Do any additional setup after loading the view, typically from a nib.
}
当文本输入完成时,将您的 ViewController
与 UITextFieldDelegate
和 enable/disable 一致,
extension ViewController: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
if emailtxt.text?.isEmpty == false && passwordtxt.text?.isEmpty == false {
signIn.isEnabled = true
} else {
signIn.isEnabled = false
}
}
}
这是您共享的代码的修复程序。
import UIKit
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
extension SignInVC: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
if emailtxt.text?.isEmpty == false && passwordtxt.text?.isEmpty == false {
signIn.isEnabled = true
} else {
signIn.isEnabled = false
}
}
}
class SignInVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
signIn.isEnabled = false
emailtxt.delegate = self
passwordtxt.delegate = self
self.hideKeyboardWhenTappedAround()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBOutlet weak var emailtxt: UITextField!
@IBOutlet weak var passwordtxt: UITextField!
@IBOutlet weak var signIn: UIButton!
}
使用SwiftValidator
https://github.com/SwiftValidatorCommunity/SwiftValidator
这样,您将像下面这样设置电子邮件和密码的验证
import SwiftValidator
let validator = Validator()
validator.registerField(emailTextField, errorLabel: emailErrorLabel, rules: [RequiredRule(), EmailRule(message: "Invalid email")])
// MARK: - ValidationDelegate
extension ViewController: ValidationDelegate {
func validationSuccessful() {
self.loginUser()
}
func validationFailed(_ errors:[(Validatable ,ValidationError)]) {
for (field, error) in errors {
//Handle as per need - show extra label - shake view etc
/*
if let field = field as? UITextField {
Utilities.shakeTheView(shakeView: field)
}
error.errorLabel?.text = error.errorMessage
error.errorLabel?.isHidden = false
*/
}
}
}
首先为 viewDidLoad()
中的所有文本字段添加这些:
emailtxt.addTarget(self, action: #selector(textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
passwordtxt.addTarget(self, action: #selector(textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
然后使用这个:
@objc func textFieldDidChange(_ textField: UITextField) {
self.buttonIsEnabled()
}
func buttonIsEnabled() {
var buttonIsEnabled = true
defer {
self.signIn.isEnabled = buttonIsEnabled
}
guard let emailtxt = self.emailtxt.text, !emailtxt.isEmpty else {
addButtonIsEnabled = false
return
}
guard let passwordtxt = self. passwordtxt.text, ! passwordtxt.isEmpty else {
addButtonIsEnabled = false
return
}
}
我在我的代码中使用这种方式并且效果很好。
甚至您可以添加更多方法来对 buttonIsEnabled 进行额外检查,例如:
self.checkEmailIsValid(for: emailtxt)
当然你应该先处理这个方法:
func checkEmailIsValid(for: String) {
//...
}
我要做的是从您的一个文本字段创建一个 IBAction,并将事件设置为 Editing Changed
:
代码应如下所示:
@IBAction func textFieldEditingDidChange(_ sender: UITextField) {
}
然后您可以通过从插座拖动到您的剩余字段,将同一个插座连接到您的两个文本字段。如果两者都正确连接,单击 IBAction 左侧的圆圈应该会显示两个文本字段:
现在,每当您的 字段中的文本发生变化时,都会触发该操作。
然后,在文件的顶部,我将创建一个 属性 的计算结果 returns false 除非两个字段中都有内容:
var shouldEnableButton: Bool {
guard let text1 = textField1.text, let text2 = textField2.text else {
return false
}
return text1.isEmpty && text2.isEmpty ? false : true
}
最后,我们将 shouldEnableButton
添加到我们的 IBAction 中:
@IBAction func textFieldEditingDidChange(_ sender: UITextField) {
button.isEnabled = shouldEnableButton
}
重要
当您将第二个文本字段连接到插座时,它会错误地将 Editing Did End
指定为其事件:
删除此事件并单击并从 Editing Changed
拖动到您的 IBAction: