2016-08-03 19 views
0

Ich bin ziemlich neu in der Programmierung, also bitte mit mir ertragen. Ich habe eine SignIn/SignUp-Funktion mit Facebook SDK. Wenn sich der Benutzer anmeldet, zeige ich den Vornamen, den Nachnamen und das Profilbild des Benutzers auf profilePageViewController an. Wenn der Benutzer jedoch die App verlässt und zu diesem ViewController geht, sind alle Labels und imageView (hier zeige ich die Datei von Assets) leer. Ich kam mit NSUserDefaults für solche Fälle, aber weiß nicht, wie man es einführt. Sie können Code für NSUserDefaults am unteren Rand finden, dass ich im Internet stolperte, aber nicht verstehen kann, wo man es und wie man es nennt, nicht ganz sicher ist, dass mein Code für meinen Fall genau ist. Gerade jetzt wird es nicht einmal aufgerufen. Schätzen Sie Ihre Hilfe und VorschlägeNSUserDefaults mit Facebook Login

import Foundation 
import UIKit 
import Parse 

class ProfilePageViewController: UITableViewController, FBSDKLoginButtonDelegate { 


@IBAction func userBeenHereButton(sender: AnyObject) { 
} 

@IBOutlet weak var userWantToGoButton: UIButton! 

@IBOutlet var profilePageTableView: UITableView! 

@IBOutlet weak var firstNameLabel: UILabel! 

@IBOutlet weak var lastNameLabel: UILabel! 

@IBOutlet weak var profilePictureImageView: UIImageView! 

let loginButton: FBSDKLoginButton = { 
    let button = FBSDKLoginButton() 
    button.readPermissions = ["email"] 
    return button 

}() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.firstNameLabel.text = "" 
    self.lastNameLabel.text = "" 
    self.profilePictureImageView?.image 

    view.addSubview(loginButton) 
    loginButton.center = view.center 
    loginButton.delegate = self 


    if let token = FBSDKAccessToken.currentAccessToken() { 
     fetchProfile() 

    } 
} 

func fetchProfile() { 
    print("func fetch profile was called") 

    let parameters = ["fields": "email, first_name, last_name, picture.type(large)"] 
    FBSDKGraphRequest(graphPath: "me", parameters: parameters).startWithCompletionHandler { (connection, result, error) -> Void in 

     if error != nil { 
      print(error) 
      return 
     } 

     var firstNameData = "" 
     var lastNameData = "" 
     var emailData = "" 
     var pictureData = "" 


     if let firstName = result.valueForKey("first_name") as? String { 
      print(firstName) 
      firstNameData = firstName 

     } 

     if let lastName = result.valueForKey("last_name") as? String { 
      print(lastName) 
      lastNameData = lastName 
     } 

     if let email = result.valueForKey("email") as? String { 
      print(email) 
      emailData = email 
     } 

     if let picture = result.valueForKey("picture")as? NSDictionary, 
      data = picture["data"] as? NSDictionary, 
      url = data["url"] as? String { 
      print(url) 
      pictureData = url 
     } 


     let user = PFUser() 
     let username = "\(firstNameData)_\(lastNameData)" 


     user["firstName"] = firstNameData 
     user["lastName"] = lastNameData 
     user["email"] = emailData 
     user["picture"] = pictureData 
     user["username"] = username 
     user["password"] = emailData 




     let currentUser = PFUser.currentUser()?.username 

     if currentUser == nil { 
      user.signUpInBackgroundWithBlock() {(success, error) -> Void in 
       if success { 
        print("successfully saved") 
       } else { 

        do 
        { 
         try PFUser.logInWithUsername(username, password: emailData) 
        } 
        catch 
        { 
         print(error) 
        } 
        self.updateUI() 
        print("profile should not be blank") 

       } 
      } 
     } 
    } 
} 


    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 

    print("complete login") 
    fetchProfile() 
    nsUserDefaults() 


} 

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { 
    print("successfully logged out") 
    PFUser.logOut() 

    self.firstNameLabel.text = "" 
    self.lastNameLabel.text = "" 
    self.profilePictureImageView?.image = UIImage(named: "user.png") 


} 

func loginButtonWillLogin(loginButton: FBSDKLoginButton!) -> Bool { 
    return true 
} 



func updateUI() { 


    if let userFirstName = PFUser.currentUser()?["firstName"] as? String { 
     firstNameLabel.text = userFirstName 
    } else { 
     self.firstNameLabel.text = "" 
    } 

    if let userLastName = PFUser.currentUser()?["lastName"] as? String { 
     lastNameLabel.text = userLastName 
    } else { 
     self.lastNameLabel.text = "" 
    } 

    if let userPicture = PFUser.currentUser()?["picture"] as? String, 
     url = NSURL(string: userPicture), 
     data = NSData(contentsOfURL: url), 
     image = UIImage(data: data) 
    { 
     profilePictureImageView?.image = image 

    } 
    else { 
     self.profilePictureImageView.image = nil 
    } 
} 
    func nsUserDefaults(){ 
      let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() 
      defaults.setObject(self.firstNameLabel.text, forKey: "firstName") 
      defaults.setObject(self.lastNameLabel.text, forKey: "lastName") 
      if let imageData = defaults.objectForKey("picture") as? NSData { 
       if let image = UIImage(data: imageData) { 

        self.profilePictureImageView.image = image 
        defaults.removeObjectForKey("picture") 
        defaults.synchronize() 
        print("NSUser") 
       } 
      } 
     } 

Antwort

0

Gelöstes Problem mit folgenden Ansatz. Erklärt statische Variablen

static let firstNameNSUserDefaults = "FIRST_NAME" 
static let lastNameNSUserDefaults = "LAST_NAME" 
static let profilePictureNSUserDefaults = "PROFILE_PICTURE" 

Edited updateUI und NSUserDefaults Funktionen, so dass sie wie folgt aussehen jetzt

func updateUI() { 

    if let userFirstName = PFUser.currentUser()?["firstName"] as? String { 
     firstNameLabel.text = userFirstName 
     let prefs = NSUserDefaults.standardUserDefaults() 
     prefs.setObject(firstNameLabel.text, forKey: ProfilePageViewController.firstNameNSUserDefaults) 
    } else { 
     self.firstNameLabel.text = "" 
    } 

    if let userLastName = PFUser.currentUser()?["lastName"] as? String { 
     lastNameLabel.text = userLastName 
     let prefs = NSUserDefaults.standardUserDefaults() 
     prefs.setObject(lastNameLabel.text, forKey: ProfilePageViewController.lastNameNSUserDefaults) 
    } else { 
     self.lastNameLabel.text = "" 
    } 

    if let userPicture = PFUser.currentUser()?["picture"] as? String, 
     url = NSURL(string: userPicture), 
     data = NSData(contentsOfURL: url), 
     image = UIImage(data: data) 
    { 
     profilePictureImageView?.image = image 
     let prefs = NSUserDefaults.standardUserDefaults() 
     let imageData = UIImageJPEGRepresentation(image, 100) 
     prefs.setObject(imageData, forKey: ProfilePageViewController.profilePictureNSUserDefaults) 

    } 
    else { 
     self.profilePictureImageView.image = nil 
    } 
} 

func nsUserDefaults(){ 

    let prefs = NSUserDefaults.standardUserDefaults() 

    if let firstNameData = prefs.stringForKey(ProfilePageViewController.firstNameNSUserDefaults) { 
     firstNameLabel.text = firstNameData 
    } 

    if let lastNameData = prefs.stringForKey(ProfilePageViewController.lastNameNSUserDefaults) { 
     lastNameLabel.text = lastNameData 
    } 

    if let imageData = prefs.objectForKey(ProfilePageViewController.profilePictureNSUserDefaults) as? NSData { 

     let storedImage = UIImage.init(data: imageData) 
     profilePictureImageView.image = storedImage 
    } 

} 

Schließlich NSUserDefaults Funktion am Ende des viewDidLoad genannt.