我有一个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就好了。但是,当我尝试在下一个视图控制器中打印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)")
}
全部打印为零。值是否未设置到对象,或者我是否尝试访问它们错误?
答案 0 :(得分:0)
关键是你要在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)")
}
并且打印所有值将为空,因为它是空的。所以可行的方法是将 userInit 对象传递给具有常量var myUser的第二个视图控制器
var myUser:User!
在prepareForSegue中从fristViewController到第二个你可以提供用户对象,因此secondVC类的代码将成为
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)")
}