2017-10-18 14 views
-1

Lorsque j'appuie sur le bouton d'inscription sans télécharger d'image, je reçois un plantage. Si je télécharge une photo sans remplir le reste de textFields, je reçois une alerte contextuelle. Comment puis-je obtenir la même alerte lorsqu'aucune photo n'est téléchargée? L'erreur que je reçois estÉcrasement lorsqu'aucune image n'est téléchargée vers Firebase

erreur fatale: de façon inattendue trouvé nulle en déballant une valeur facultative

@IBAction func signUpAction(_ sender: Any) { 
    let email = emailTextField.text!.lowercased() 
    let finalEmail = email.trimmingCharacters(in: .whitespacesAndNewlines) 
    let location = locationTextField.text! 
    let biography = biographyTextField.text! 
    let username = usernameTextField.text! 
    let password = passwordTextField.text! 
    let firstLastName = firstLastNameTextField.text! 
    let pictureData = UIImageJPEGRepresentation(self.userImageView.image!, 0.70) 

    if finalEmail.isEmpty || location.isEmpty || biography.isEmpty || username.isEmpty || password.isEmpty { 
     self.view.endEditing(true) 
     let alertController = UIAlertController(title: "OOPS", message: " You must fill all the fields", preferredStyle: .alert) 
     alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     present(alertController, animated: true, completion: nil) 

    }else { 
     self.view.endEditing(true) 
     authService.signUP(username: username, email: finalEmail, location: location, biography: biography, password: password, pictureData: pictureData as NSData!) 

    } 


} 

    var authService = AuthService() 



struct AuthService{ 

var dataBaseRef: DatabaseReference!{ 
    return Database.database().reference() 
} 
var storageRef: StorageReference!{ 
    return Storage.storage().reference() 
} 

func signUP(username: String, email: String, location: String, biography: String, password: String, pictureData: NSData!) { 

    Auth.auth().createUser(withEmail: email, password: password) { (user, error) in 
     if error == nil{ 

      self.setUserInfo(user: user, username: username, location: location, biography: biography, password: password, pictureData: pictureData) 

     }else{ 
      print(error?.localizedDescription) 
     } 
    } 


} 

private func setUserInfo(user: User!, username: String, location: String, biography: String, password: String, pictureData: NSData!){ 

    let imagePath = "profileImage\(user.uid)/userPic.jpg" 
    let imageRef = storageRef.child(imagePath) 

let metaData = StorageMetadata() 
    metaData.contentType = "image/jpeg" 
    imageRef.putData(pictureData as Data, metadata: metaData){(newMetaData, error) 
     in 
     if error == nil{ 
      let changeRequest = user.createProfileChangeRequest() 
      changeRequest.displayName = username 
      if let photoURL = newMetaData!.downloadURL(){ 
       changeRequest.photoURL = photoURL 

      } 
      changeRequest.commitChanges(completion: { (error) in 
       if error == nil{ 

        self.saveUserInfo(user: user, username: username, location: location, biography: biography, password: password) 

        print("user info set") 

       }else{ 
        print(error?.localizedDescription) 
       } 
      }) 

     }else{ 
      print(error?.localizedDescription) 
     } 

    } 

} 

private func saveUserInfo(user: User!, username: String, location: String, biography: String, password: String){ 

    let userInfo = ["email": user.email!, "username": username, "location": location, "biography": biography, "uid": user.uid, "photoURL": String(describing: user.photoURL!)] 

    let userRef = dataBaseRef.child("users").child(user.uid) 
    userRef.setValue(userInfo) { (error, ref) in 
     if error == nil{ 
      print("USER SAVED") 
      self.logIn(email: user.email!, password: password) 
     }else{ 
      print(error?.localizedDescription) 

     } 
    } 

} 

func logIn(email: String, password: String){ 

    Auth.auth().signIn(withEmail: email, password: password) { (user, error) in 
     if error == nil { 
      if let user = user { 
       print("\(user.displayName!) has been signed in") 

       let appDel : AppDelegate = UIApplication.shared.delegate as! AppDelegate 
       appDel.logUser() 

      }else{ 
       print(error?.localizedDescription) 

      } 

     } 
    } 
} 

}

+0

Essayez d'ajouter cette condition '|| pictureData == nil' après '|| password.isEmpty' dans 'if' statement.Also je voudrais vous suggérer d'apporter des modifications dans votre code et essayer de supprimer'! 'de votre code et utiliser des instructions' if 'ou 'guard' dans votre code pour dérouler en toute sécurité vos options – 3stud1ant3

+0

encore obtenir la même erreur après avoir ajouté || pictureData == nil to my if – user8000557

Répondre

0

Je pense que vous devez ajouter ceci:

var pictureData: NSData? //Try using Data in your code in swift 

if let imageView = self.userImageView.image { 
    pictureData = UIImageJPEGRepresentation(imageView, 0.70) 
} 

puis ajoutez ce instruction || pictureData == nil après || password.isEmpty dans if déclaration

+0

Veuillez ne pas répondre aux questions en double. Au lieu de cela, votez pour les fermer. – JAL

+0

Aussi, c'est une mauvaise réponse. Pourquoi voudriez-vous forcer 'self.userImageView.image' après avoir assigné' imageView' avec 'if let'? – JAL

+0

Désolé ma mauvaise, je ne peux pas supprimer ma réponse, donc je l'ai mis à jour et corrigé l'erreur que j'ai faite, merci de votre contribution – 3stud1ant3