2017-11-05 5 views
0

So scheint das Problem mit meinem Profil ViewController zu sein. Ich stelle den aktuellen Benutzer ein, nachdem ich mich in diesem Codefragment angemeldet habe.Controller initialisiert, bevor app sogar geht es

Danach geht es zu meinem profileViewController und versucht, nach dem Benutzer zu suchen, der sich als null herausstellt. Warum sollte es dort hingehen, bevor ich überhaupt zum Viewcontroller gegangen bin? Warum ist es null? Unten ist mein Profil View-Controller und meine viewDidLoad

class ProfileeViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 
     var profileHandle: DatabaseHandle = 0 
     var profileRef: DatabaseReference? 
     let cellID = "cellID" 
     let profileSetupTransition = AlterProfileViewController() 
     let settingView = SettingsViewController() 
     var userEvents = [Event]() 
     var userId: String? 
     var user: User? 
     var emptyLabel: UILabel? 

     var currentUserName: String = "" 


     override func viewDidLoad() { 
      super.viewDidLoad() 
      collectionView?.backgroundColor = UIColor.white 
      let user = self.user ?? User.current 

      profileHandle = UserService.observeProfile(for: user) { [unowned self](ref, user, events) in 
       self.profileRef = ref 
       self.user = user 
       self.userEvents = events 
       // self.jobs = allJobs 
       // self.reciepts = allReciepts 

       // print(self.userEvents) 
       // print(self.reciepts) 
       DispatchQueue.main.async { 
        self.collectionView?.reloadData() 
       } 

      } 

Das Verfahren, in dem ich setCurrent nennen, ist unter

// will handle the sign up of a user 
    @objc func handleSignUp(){ 
     // first we cant to take sure that all of the fields are filled 
     var profilePic: String = "" 
     // will take the user selected image and load it to firebase 
     let imageName = NSUUID().uuidString 
     guard let username = self.nameTextField.text, 
      let confirmPassword = self.confirmPasswordTextField.text, 
      let email = self.emailTextField.text, 
      let password = self.passwordTextField.text, 
      !username.isEmpty, 
      !email.isEmpty, 
      !password.isEmpty, 
      !confirmPassword.isEmpty 
      else { 
       print("Required fields are not all filled!") 
       return 
     } 
     if self.validateEmail(enteredEmail:email) != true{ 
      let alertController = UIAlertController(title: "Error", message: "Please Enter A Valid Email", preferredStyle: .alert) 
      let defaultAction = UIAlertAction(title: "Ok", style: .cancel, handler: nil) 
      alertController.addAction(defaultAction) 
      self.present(alertController, animated: true, completion: nil) 
     } 
     // will make sure user is validated before it even tries to create user 
     // will make sure the password and confirm password textfields have the same value if so it will print an error 
     if self.passwordTextField.text != self.confirmPasswordTextField.text { 
      let alertController = UIAlertController(title: "Error", message: "Passwords Don't Match", preferredStyle: .alert) 
      let defaultAction = UIAlertAction(title: "Ok", style: .cancel, handler: nil) 
      alertController.addAction(defaultAction) 
      self.present(alertController, animated: true, completion: nil) 
     } 
     //create a reference to the sotrage database in firebase 
     let storageRef = Storage.storage().reference().child("profile_images").child("\(imageName).PNG") 
     //following function does the work of putting it into firebase 
     //notice I also set the value of profilepic oo it can be saved in the updated user instance in the database 
     if let userImage = selectedImageFromPicker,let uploadData = UIImageJPEGRepresentation(userImage, 0.1){ 
      AuthService.createUser(controller: self, email: email, password: password) { (authUser) in 
       guard let firUser = authUser else{ 
        return 
       } 
       storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in 
        if error != nil { 
         print(error ?? "") 
         return 
        } 
        profilePic = (metadata?.downloadURL()!.absoluteString)! 
        //printing to make sure values are contained in these strings 
        print(profilePic) 
        print(username) 

        UserService.create(firUser, username: username, profilePic: profilePic, location: self.userLocation!, completion: { (user) in 
         guard let user = user else { 
          print("User not loaded into firebase db") 
          return 
         } 
         User.setCurrent(user, writeToUserDefaults: true) 
         // will set the current user for userdefaults to work 
         print(user.profilePic ?? "") 
         print(user.username ?? "") 

         // self.delegate?.finishSigningUp() 
         self.finishSigningUp() 

        }) 
       }) 
      } 
     } 
    } 

Dann ist diese Methode den Benutzer auf das homeviewController genannt wird und es als root gesetzt zu bewegen

+0

"Warum sollte es dort hingehen, bevor ich überhaupt zum Viewcontroller gegangen bin?" Können Sie bitte mehr erklären? – 3stud1ant3

+1

Wo rufst du 'setCurrent' in Bezug auf den' ProfileeViewController' an, der angezeigt wird? – Paulw11

+0

Nun, nachdem ich mich in der Anmeldung Controller und es setzt abzureisen ist aus irgendeinem Grund geht es direkt auf die Benutzervariable Ich habe im Profil viewController @ Paulw11 –

Antwort

0

Wenn Sie tun, User.current wird auf dem Benutzer standardmäßig den aktuellen Benutzer abrufen, die Sie zuvor auf dem gespeichert haben Benutzer standardmäßig auf Ihre setCurrent Methode richtig?

Haben Sie mit dem Schlüssel "currentUser" überprüft, ob der Benutzer korrekt in den Benutzereinstellungen gespeichert ist? Vielleicht ist es deshalb null.

Warum sollte es dort hingehen, bevor ich überhaupt zum Viewcontroller gegangen bin? Vielleicht machst du einige kinf der asynchronen Methodenberechnung und selbst wenn es nicht fertig ist, bewegst du dich auf den vie controller. Sie bewegen sich ohne das Ergebnis Ihrer asynchronen Methode dorthin und es ist logisch, dass Ihre Werte Null sind, weil Sie sie nicht setzen lassen. Das ist eine Hypothese, da ich Ihren Codeabschnitt sehe und Sie einige asynchrone Methoden in Ihrem Code-Flow aufrufen.

Verwandte Themen