值未正确设置为User对象

时间:2017-04-04 13:05:34

标签: ios swift

我有一个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)")
}

全部打印为零。值是否未设置到对象,或者我是否尝试访问它们错误?

1 个答案:

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