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 函数。
我对编程很陌生,所以请多多包涵。我有 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 函数。