我有两个屏幕,第一个是登录屏幕,第二个屏幕显示用户信息。在登录屏幕上,我将 user_id 值保留在 user.defaults 中,当我转到第二个屏幕时,我使用该值来调用 Web 服务并显示其信息,但出现错误,并且 user.default 中保存的值是零。最后,当用户单击 cerrar_sesion 时,我删除了 user.defaults 我该如何解决它?这是我的代码:
func login(){
let id_usuario = 7
Constants.lbd.set(id_usuario, forKey: "id_usuario")
self.performSegue(withIdentifier: "second_view", sender: self)
Constants.lbd.synchronize()
}
第二个 View :
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()
}
最后我在控制台中得到了这个: 零 fatal error :在解包可选值时意外发现 nil
提前致谢
最佳答案
首先,有一个专用方法可以从 UserDefaults
中读取 Int
(假设 Constants.lbd
是一个类型别名 用于 UserDefaults.standard
)
let id_usuario = Constants.lbd.integer(forKey: "id_usuario")
其次,不要使用 UserDefaults
在 View Controller 之间共享数据。将值保存在 UserDefaults
中很好,但最好在 segue 中传递值,例如通过 sender
参数
self.performSegue(withIdentifier: "second_view", sender: id_usuario)
请注意,这是 Swift 而不是 PHP 或 JavaScript。变量和函数名称应该是 camelCased 而不是 snake_cased。
关于ios - 错误打印 user.default swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47312472/