Ios 打印用户时出错。默认为swift 3
我有两个屏幕,第一个是登录,第二个显示用户信息。在登录屏幕上,我将user_id值保留在user.defaults中,当我转到第二个屏幕时,我使用该值调用web服务并显示其信息,但我有一个错误,并且保存在user.default中的值为nil。最后,当用户单击cerrar\u session时,我将删除该用户。默认设置我如何解决它?这是我的代码: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
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_的值,我可以解决这个问题,但是你的答案是正确的,谢谢我的朋友