NSUserDefaults 与 Facebook 登录

NSUserDefaults with Facebook login

我对编程很陌生,所以请多多包涵。我有 Facebook SDK 的 signIn/signUp 功能。当用户注册时,我在 profilePageViewController 上显示用户的名字、姓氏和个人资料图片。但是,当用户离开应用程序并转到此 viewController 时,所有标签和 imageView(此处我实际上显示来自资产的文件)都是空白的。对于这种情况,我使用了 NSUserDefaults,但不知道如何实现它。您可以在底部找到 NSUserDefaults 的代码,这是我在互联网上浏览时想到的,但无法理解将其放置在何处以及如何调用它,也不太确定我的代码是否适合我的情况。现在它甚至没有被调用。感谢您的帮助和建议

 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")
                }
            }
        }

通过以下方法解决了问题。声明的静态变量

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

编辑了 updateUI 和 nsUserDefaults 函数,现在它们看起来像这样

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
    }

}

终于在 viewDidLoad 的最后调用了 nsUserDefaults 函数。