我有一个User
对象..
class User: NSObject {
var uid: String!
var handle: String!
var name: String!
var profilePicture: String!
var gender: String!
var rooms: [String : AnyObject]!
}
.. 当用户注册应用时,它会设置其值,使用以下函数设置 Firebase 和 User
对象中的值:
// Set inital user info to User object & Firebase
func setUserInfo() {
let userInit = User()
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").childByAutoId()
let params = ["fields" : "first_name"]
let graphRequest = GraphRequest(graphPath: "me", parameters: params)
graphRequest.start {
(urlResponse, requestResult) in
switch requestResult {
case .failed(let error):
print("error in graph request:", error)
break
case .success(let graphResponse):
if let responseDictionary = graphResponse.dictionaryValue {
print(responseDictionary)
// Name
if let name = responseDictionary["first_name"] {
userRef.child("name").setValue(name)
// Profile pic
let facebookID: NSString = (responseDictionary["id"] as! NSString)
let profilePic = "https://graph.facebook.com/\(facebookID)/picture?type=large&return_ssl_resources=1"
userRef.child("profilePicture").setValue(profilePic)
// Handle
// Also check DB to make sure handle isn't already in use
if self.handleTextField.text != nil {
if let handle = self.handleTextField.text {
userRef.child("handle").setValue(handle)
// Gender
var gender = ""
switch self.genderString {
case "male":
gender = "male"
userRef.child("gender").setValue("male")
case "female":
gender = "female"
userRef.child("gender").setValue("female")
default:
gender = "other"
userRef.child("gender").setValue("other")
}
// UID
if let uid = FIRAuth.auth()?.currentUser?.uid {
userInit.uid = uid
userRef.child("uid").setValue(uid)
print("uid: \(uid)")
}
// Set all values to User object
userInit.name = name as! String
userInit.handle = handle
userInit.gender = gender
userInit.profilePicture = profilePic
self.user.append(userInit)
print("name: \(name)")
print("handle: \(handle)")
print("gender: \(gender)")
print("profilePic: \(profilePic)")
}
}
}
}
}
}
}
这样,所有用户信息就可以上传到 Firebase 了。但是,当我尝试在下一个 View Controller 中打印 User
对象的值时:
let user = [User]()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let users = User()
print("name: \(users.name)")
print("handle: \(users.handle)")
print("gender: \(users.gender)")
print("profilePic: \(users.profilePicture)")
}
全部打印为零。这些值是否未设置为对象,或者我是否尝试错误地访问它们?
最佳答案
重点是您正在 viewDidAppear(_animated: Bool)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let users = User() //you created new empty object of User Type
print("name: \(users.name)")
print("handle: \(users.handle)")
print("gender: \(users.gender)")
print("profilePic: \(users.profilePicture)")
}
并打印所有值将为您提供 nil,因为它是空的。因此,有效的方法是将 userInit 对象传递给具有常量 var myUser
的第二个 View Controllervar myUser:User!
在从fristViewController到第二个的prepareForSegue中,您可以提供用户对象,因此第二个VC类的代码将变为
SecondViewController.swift
var myUser:User!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let users = User() //you created new empty object of User Type
users = myUser
print("name: \(users.name)")
print("handle: \(users.handle)")
print("gender: \(users.gender)")
print("profilePic: \(users.profilePicture)")
}
关于ios - 值未正确设置为用户对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43208119/