Ошибка Swift и Firebase: невозможно преобразовать значение типа 'UITextField' в ожидаемый тип аргумента 'String' - PullRequest
0 голосов
/ 19 марта 2020

Я хотел бы начать с этого и извиниться, если я использую неправильную терминологию, поскольку я чрезвычайно новичок в кодировании, и я выбираю Swift в качестве моего первого языка.

У меня, кажется, есть некоторые проблемы с моим сбросить функцию пароля, которую я пытаюсь создать, используя Swift и Firebase, и получаю сообщение об ошибке «Не удается преобразовать значение типа« UITextField »в ожидаемый тип аргумента« String »» в следующей строке кода:

Auth.auth().sendPasswordReset(withEmail: email)

Вызов сброса для сброса пароля является частью следующего действия IB, которое сбрасывает пароль на основании адреса электронной почты, введенного в UITextField, а также проверяет, является ли он действительным адресом электронной почты:

@IBAction func resetButton(_ sender: Any) {
    if let email = emailTextField {
        Auth.auth().sendPasswordReset(withEmail: email)
            func isValidEmail(_ email: String) -> Bool {
                let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

                let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
                return emailPred.evaluate(with: email)
            }
        }
    }

Я надеюсь, что вы, ребята, можете помочь решить две проблемы:

1) Как мне решить эту ошибку, которую я не могу решить?

2) Как я могу кодировать пользовательский интерфейс для отображения всплывающего сообщения для отображения «Пожалуйста, введите действительный адрес электронной почты», если в UITextField введен недействительный адрес электронной почты?

Спасибо, ребята, что нашли время, чтобы прочитать мой пост, и я надеюсь, что вы сможете помочь с моими проблемами!

Ответы [ 3 ]

0 голосов
/ 19 марта 2020

В основном вы пытались поместить UITextField в поле String. Похоже, emailTextField это UITextField, а не String.

Какой код на самом деле будет

@IBAction func resetButton(_ sender: Any) {
    if let email = emailTextField.text {
       if isValidEmail(email) {
           Auth.auth().sendPasswordReset(withEmail: email)
          } else {
             // Invalid email
        }
     }
 }

func isValidEmail(_ email: String) -> Bool {
      let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

      let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
      return emailPred.evaluate(with: email)
 }
0 голосов
/ 19 марта 2020

Прежде всего функция isValidEmail не выполняется внутри IBAction. Вы должны вызывать его явно независимо от того, где объявлена ​​функция.

Ошибка довольно очевидна: email / emailTextField - это текстовое поле, а не строка, вы должны получить текст из text property.

resetButton вызывает isValidEmail, при успехе отправляет строку, при ошибке выдает сообщение об ошибке.

@IBAction func resetButton(_ sender: Any) {
    guard let email = emailTextField.text else { return }            
    if isValidEmail(email) {
        Auth.auth().sendPasswordReset(withEmail: email)
    } else {
        let alertController = UIAlertController(title: "Email validation failed", message: "Please enter a valid email address", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)
    }
}


func isValidEmail(_ email: String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailPred.evaluate(with: email)
}
0 голосов
/ 19 марта 2020

Похоже, email это UITextField.

Вам нужно сделать UITextField.text, чтобы получить текст UITextField; для вас это email.text.

Однако я бы переименовал ваш UITextField в emailTextField вместо email.

Уточнение: у вас есть 2 email идентификаторов в одном и том же методе. if let email = emailTextField и func isValidEmail(_ email: String) -> Bool {. Вам необходимо изменить один из них, чтобы иметь возможность надлежащим образом работать с этими наборами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...