Отключить / включить кнопку в Xcode - PullRequest
0 голосов
/ 29 апреля 2018

Привет, я новичок в программировании Swift. То, что я пытаюсь сделать, это отключить мою кнопку (signIn) в 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!

Мне нужна помощь, чтобы создать функцию входа в систему, которая будет держать кнопку отключенной до тех пор, пока в текстовых полях (emailtxt & passwordtxt) не будет текста, а затем продолжить.

Рад, что кто-нибудь может меня отсортировать. Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Что я хотел бы сделать, это создать IBAction из одного из ваших текстовых полей и установить событие на Editing Changed:

IBAction set to Editing Changed

Код должен выглядеть так:

@IBAction func textFieldEditingDidChange(_ sender: UITextField) {

}

Затем вы можете подключить одну и ту же розетку к обоим текстовым полям, перетащив из розетки в оставшееся поле. Если вы правильно подключили оба, щелкнув по кружку слева от вашего IBAction, вы увидите два текстовых поля:

Действие теперь будет запускаться при каждом изменении текста в либо ваших полей.

Затем в верхней части файла я бы создал вычисляемое свойство, которое возвращает 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:

0 голосов
/ 29 апреля 2018

Использование 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
*/
        }
    }
}
0 голосов
/ 29 апреля 2018

Сначала добавьте их для всех ваших текстовых полей в 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) {
   //...
}
0 голосов
/ 29 апреля 2018

Установить 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 и включите / отключите по окончании ввода текста,

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!
}
...