【发布时间】:2018-02-24 10:34:34
【问题描述】:
我有一个两步登录过程。在第一个屏幕上,我将 FB 用户的详细信息保存到 UserDefaults。
当我加载第二个 ViewController 时,它应该加载用户的个人资料图像和用户名(我使用“fullname”创建)。它实际上在我第二次加载用户时有效,但从来没有第一次,是否有某种延迟?我已经尝试过UserDefaults.standard.synchronize() 但这无济于事。它甚至可以打印细节,所以我知道它可以工作......
let userName = fullName.replacingOccurrences(of: " ", with: "_")
UserDefaults.standard.setValue(userName, forKey: "username")
if let picture = result["picture"] as? NSDictionary , let data = picture["data"] as? NSDictionary, let url = data["url"] as? String {
UserDefaults.standard.setValue(url, forKey: "userFBPicURL")
let username = UserDefaults.standard.value(forKey: "username") as? String
let profileImage = UserDefaults.standard.value(forKey: "userFBPicURL") as? String
UserDefaults.standard.synchronize()
print ("Details are User:",username, "profileImage:",profileImage)
在self.performSegue(withIdentifier: "UsernameSegue", sender: self)之后的新VC中:
override func viewDidLoad() {
super.viewDidLoad()
if let username = UserDefaults.standard.value(forKey: "username") as? String {usernameTextfield.text = username}
if FBSDKAccessToken.current() != nil {loadFacebookProfileImage()}
}
【问题讨论】:
-
第一个sn-p中添加的代码你放在哪里了?
-
在这种情况下,不建议(错误)使用
UserDefaults作为在控制器之间传递数据的临时存储。将数据存储在UserDefaults中,但将其在performSegue中传递给第二个控制器,这样更可靠。和往常一样,永远不要将value(forKey与UserDefaults一起使用,正确的方法是object(forKey,或者在这种情况下甚至是string(forKey。设置器是set(...不是setValue(...。并且不要在 Swift 中使用NSDictionary,使用原生类型。 -
@hardikparmar 在我的注册方法中
-
可能是因为你
synchronize它只有在你得到图片、数据和url的情况下。设置用户名后尝试synchronize。 -
@hardikparmar 没用 :(
标签: ios swift fbsdk userdefaults