Ios 打印用户时出错。默认为swift 3

Ios 打印用户时出错。默认为swift 3,ios,swift3,Ios,Swift3,我有两个屏幕,第一个是登录,第二个显示用户信息。在登录屏幕上,我将user_id值保留在user.defaults中,当我转到第二个屏幕时,我使用该值调用web服务并显示其信息,但我有一个错误,并且保存在user.default中的值为nil。最后,当用户单击cerrar\u session时,我将删除该用户。默认设置我如何解决它?这是我的代码: func login(){ let id_usuario = 7 Constants.lbd.set(id_usuar

我有两个屏幕,第一个是登录,第二个显示用户信息。在登录屏幕上,我将user_id值保留在user.defaults中,当我转到第二个屏幕时,我使用该值调用web服务并显示其信息,但我有一个错误,并且保存在user.default中的值为nil。最后,当用户单击cerrar\u session时,我将删除该用户。默认设置我如何解决它?这是我的代码:

func login(){
        let id_usuario = 7
        Constants.lbd.set(id_usuario, forKey: "id_usuario")
        self.performSegue(withIdentifier: "second_view", sender: self)
        Constants.lbd.synchronize()
}
第二种观点:

override func viewDidLoad() {
        super.viewDidLoad()
        btn_cerrarSesion.addTarget(self, action: #selector(cerar_sesion), for: .touchUpInside)
        info_usuario()
}

    func info_usuario(){
            let auth = "ASASDWDASD!"
            let id_usuario = Constants.lbd.object(forKey: "id_usuario") as? Int
print(id_usuario)
            Services.objServices.ServObtUsuario(auth: auth!, id_usuario: id_usuario!).then{
                data -> Void in
                let res = JSON(data)
                let status = res["status"].boolValue
                if(status){
                    let info_usuario = res["data"]["usuarios"]
                    for(_, sub_res):(String, JSON) in info_usuario{
                        self.lbl_nombres_usuario.text = sub_res["nombres"].stringValue+" "+sub_res["apellidos"].stringValue
                        self.lbl_username.text = sub_res["username"].stringValue
                    }
                }else{
                    let error = res["error"]["error_data"].stringValue
                    print(error)
                }
                }.catch{
                    error -> Void in
            }
        }


func cerar_sesion(){
        self.performSegue(withIdentifier: "second_view", sender: self)
        Constants.lbd.object(forKey: "id_usuario")        
        Constants.lbd.removeObject(forKey: "id_empresa")
        Constants.lbd.removeObject(forKey: "rol")
        Constants.lbd.removeObject(forKey: "auth")
        Constants.lbd.synchronize()
    }
最后,我在控制台中看到: 无 致命错误:在展开可选值时意外发现nil


提前感谢

您需要在保存值后立即调用
Userdefaults的
synchronize
方法

默认情况下,用户默认值将需要一些时间将新值保存到
Plist

调用
Userdefaults
的synchronizes方法的唯一缺点是需要花费处理时间


此外,避免强制展开。

首先,有一种专用方法可以从
UserDefaults
读取
Int
(假设
常量。lbd
UserDefaults.standard
的类型别名)

其次,不要使用
UserDefaults
在视图控制器之间共享数据。可以将值保存在
UserDefaults
中,但最好在segue中传递值,例如通过
sender
参数传递

self.performSegue(withIdentifier: "second_view", sender: id_usuario)


请注意,这是Swift,而不是PHP或JavaScript。变量和函数名应该是camelCased而不是snake\u cased。

这是我的解决方案

对于您的代码行:

Constants.lbd.set(id_usuario, forKey: "id_usuario")
此用户:

   UserDefaults.standard.set(id_usuario,forKey:"id_usuario") // Use Integer to store this value
  let id_usuario =   UserDefaults.standard.integer(forKey:"id_usuario") // Use Integer to store this value
对于第二个VC中的代码行:

 let id_usuario = Constants.lbd.object(forKey: "id_usuario") as? Int
此用户:

   UserDefaults.standard.set(id_usuario,forKey:"id_usuario") // Use Integer to store this value
  let id_usuario =   UserDefaults.standard.integer(forKey:"id_usuario") // Use Integer to store this value

这将解决您的问题

是的,我使用了synchronize,但我忘记了,但根据Apple文档,我得到了相同的错误:“此方法是不必要的,不应该使用。”在调用perform segue`Constants.lbd.synchronize()self.Performsgue(带标识符:“second_view”,发件人:self)之前,请尝试调用synchronize`@Diego Israel Moreno保存数据后,您需要调用synchronize()。您在print(id_usuario)@SucharuHasija nil my friends中得到的值是什么?问题是,您没有从常量中得到值“变量和函数名应该是camelCased而不是snake_cased。”哈哈哈哈:)答案不错,因此+1:)我这样做了,但我得到的值=0。我在删除常量时得到的值为0。lbd.removeObject(forKey:“id\u usuario”)请替换这两行。当我第一次安装应用程序时,我得到的值为0,之后我可以得到id_的值,我可以解决这个问题,但是你的答案是正确的,谢谢我的朋友