ios - 值未正确设置为用户对象

标签 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 了。但是,当我尝试在下一个 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 Controller
var 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/

相关文章:

Java sha256 与 Swift sha256 不匹配

swift - 在加载时针对不同的屏幕尺寸使用不同的 Storyboard? xcode swift

ios - 选项卡栏确实选择了委托(delegate)方法在 ios 中给出了先前选择的选项卡索引,swift 3

ios - 后台模式下的 HKObserverQuery

ios - 如何在不备份到 iCloud 的情况下为我的应用程序提供演示数据?

android - 将应用程序部署为 Web 应用程序以及 Google Android 或 Apple iOS 上的 native 应用程序

swift - 如何在结构中将 var 的返回类型定义为空数组?

swift - NSPredicate:如何将 CONTAINS 与 NSDate 字段一起使用?

ios - 如何在另一个 ViewController 中加载 UIViewController XIB?

ios - 从 Swift 回调中返回对象