Hello,
In creating my user profile in app, I am getting this error below. It’s the only error. Any clue how to fix it?
class SignUpViewController:UIViewController, UITextFieldDelegate {
@IBOutlet var imageView: UIImageView!
@IBOutlet var uploadBtn: UIButton!
@IBOutlet var retrieveImages = [UIImage]()
@IBOutlet var firstNameTextField: UITextField!
@IBOutlet var lastNameTextField: UITextField!
@IBOutlet var emailTextField: UITextField!
@IBOutlet var passwordTextField: UITextField!
@IBOutlet var signUpButton: UIButton!
@IBOutlet var errorLabel: UILabel!
var imagePicker: UIImagePickerController!
override func viewDidLoad() {
super.viewDidLoad()
setUpElements()
func setUpElements() {
// Hide the error label
errorLabel.alpha = 0
// Style the elements
Utilities.styleTextField(firstNameTextField)
Utilities.styleTextField(lastNameTextField)
Utilities.styleTextField(emailTextField)
Utilities.styleTextField(passwordTextField)
Utilities.styleFilledButton(signUpButton)
// Profile image
imageView.layer.cornerRadius = imageView.bounds.height / 2
imageView.layer.borderWidth = 12
imageView.layer.borderColor = UIColor.white.cgColor
imageView.clipsToBounds = true
}
}
// Photo gallery
@IBAction func imagePickerBtn(_ sender: Any) {
let picker = UIImagePickerController()
picker.allowsEditing = true
picker.delegate = self
present(picker, animated: true)
}
// Dismiss our view
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let imageData = info[.editedImage] as? UIImage else {return}
imageView.image = imageData
dismiss(animated: true)
}
// Task a selfie
@IBAction func camerPictureBtn(_ sender: Any) {
let photoTaker = UIImagePickerController()
photoTaker.sourceType = .camera
photoTaker.allowsEditing = true
photoTaker.delegate = self
present(photoTaker, animated: true)
}
// dismiss the picker
func imagePickerControllerDidCancel(_ photoTaker: UIImagePickerController) {
photoTaker.dismiss(animated: true, completion: nil)
}
func validateFields() -> String? {
// 2. Check that all fields are filled in
if firstNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
lastNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
emailTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
passwordTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
return "Please fill in all fields."
}
// 3. Check if the password is secure
let cleanedPassword = passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if Utilities.isPasswordValid(cleanedPassword) == false {
// 4.Password isn't secure enough
return "Please make sure your password is at least 8 characters, contains a special character and a number."
}
return nil
}
/**
Enables or Disables the **continueButton**.
*/
@objc func handleSignUp() {
guard let firstName = firstNameTextField.text else { return }
guard let lastName = lastNameTextField.text else { return }
guard let email = emailTextField.text else { return }
guard let pass = passwordTextField.text else { return }
guard let image = imageView.image else { return }
// setContinueButton(enabled: false)
// continueButton.setTitle("", for: .normal)
// activityView.startAnimating()
Auth.auth().createUser(withEmail: email, password: pass) { user, error in
if error == nil && user != nil {
print("User created!")
// 1. Upload the profile image to Firebase Storage
self.uploadProfileImage(image) { url in
if url != nil {
let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
changeRequest?.displayName = firstName
changeRequest?.displayName = lastName
changeRequest?.photoURL = url
changeRequest?.commitChanges { error in
if error == nil {
print("User display name changed!")
self.saveProfile(username: firstName, profileImageURL: url!) { success in
if success {
self.dismiss(animated: true, completion: nil)
}
}
} else {
print("Error: \(error!.localizedDescription)")
}
}
} else {
// Error unable to upload profile image
}
}
} else {
print("Error: \(error!.localizedDescription)")
}
}
}
func uploadProfileImage(_ image:UIImage, completion: @escaping ((_ url:URL?)->())) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let storageRef = Storage.storage().reference().child("user/\(uid)")
guard let imageData = image.jpegData(compressionQuality: 0.75) else { return }
let metaData = StorageMetadata()
metaData.contentType = "image/jpg"
storageRef.putData(imageData, metadata: metaData) { metaData, error in
if error == nil, metaData != nil {
if let url = metaData?.downloadURL() {
completion(url)
} else {
completion(nil)
}
// success!
} else {
// failed
completion(nil)
}
}
}
func saveProfile(username:String, profileImageURL:URL, completion: @escaping ((_ success:Bool)->())) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let databaseRef = Database.database().reference().child("users/profile/\(uid)")
let userObject = [
"username": username,
"photoURL": profileImageURL.absoluteString
] as [String:Any]
databaseRef.setValue(userObject) { error, ref in
completion(error == nil)
}
}
}
extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// private func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
// picker.dismiss(animated: true, completion: nil)
// }
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let pickedImage = info[UIImagePickerController.InfoKey.editedImage.rawValue] as? UIImage {
self.imageView.image = pickedImage
}
picker.dismiss(animated: true, completion: nil)
}
}