UITextField Программно не преобразуется в строку и не принимает бинарные операторы Xcode - PullRequest
0 голосов
/ 30 мая 2020

До появления этой проблемы я использовал раскадровки и розетки для текстовых полей. Однако мне стало проще работать с моим приложением программно. К сожалению, когда я начал преобразовывать свое приложение, например, программно создавая текстовое поле, я столкнулся с некоторыми проблемами, так как у меня все еще есть некоторые функции, такие как функция входа в систему, которая была создана для текстовых полей из раскадровок. Я все еще новичок, поэтому любые решения будут полезны.

Я объявил свое текстовое поле электронной почты как таковое:

    var emailTxt: UITextField! 

Другие аспекты текстового поля электронной почты как таковые находятся в просмотр действительно загрузил функцию:

    emailTxt = UITextField(frame: CGRect(x: 77.0, y: 306.0, width: 262, height: 34))
    emailTxt.backgroundColor = .white
    emailTxt.borderStyle = .roundedRect
    emailTxt.keyboardAppearance = .light
    emailTxt.keyboardType = .emailAddress
    emailTxt.placeholder = "Email"
    emailTxt.font = UIFont.systemFont(ofSize: 14.0)
    emailTxt.textColor = .systemGreen
    emailTxt.tintColor = .systemGreen
    emailTxt.delegate = self

    self.view.addSubview(emailTxt)

Функции текстового поля за пределами представления загрузились:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
}

Наконец, область, в которой я получаю проблемы.

Во-первых, он говорит, что для оператора защиты должен быть оператор else.

Затем он говорит (Бинарный оператор '! =' Не может применяться к операндам типа 'UITextField?' И 'String') Затем в операторе else говорится (выражение закрытия не используется)

Наконец, в операторе auth выдается ошибка: невозможно преобразовать значение типа 'UITextField' в ожидаемый тип аргумента 'String', в то время как подчеркнув письмо

Вот код для этого:

    guard let email = emailTxt
    email != "",
    let password = passwordTxt
    password != ""
        else {
            AlertController.showAlert(self, title: "Missing Info", message: "Please fill out all fields")
            return

    }

    Auth.auth().signIn(withEmail: email, password: password, completion: {(user, error) in
        guard error == nil else {
            AlertController.showAlert(self, title: "Error", message: error!.localizedDescription)
            return
        }

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Ваша ошибка говорит сама за себя, вы пытаетесь использовать тип UITextField как String. Здесь вам нужно использовать свойство .hasText протокола UIKeyInput, которому соответствует UITextField. Вот как это сделать:

guard emailTxt.hasText,
passwordTxt.hasText
    else {
        AlertController.showAlert(self, title: "Missing Info", message: "Please fill out all fields")
        return
}
let email = emailTxt.text!
let password = passwordTxt.text!

Вы можете принудительно развернуть текст UITextField, потому что по умолчанию это пустая строка "". Даже если он установлен на nil, он возвращает пустую строку.

0 голосов
/ 30 мая 2020

Отсутствует свойство .text.

guard let email = emailTxt.text, !email.isEmpty else {
    // show alert
    return
}

Начиная с iOS 10 , его также можно просто записать как:

guard emailTxt.hasText else {
    // show alert
    return
}

Благодарим @LeoDabus за указание на это

...