我正在创建一个应用程序,我希望用户在他们向应用程序注册帐户后一直登录,直到用户决定删除该帐户为止。 它的工作原理类似于whatsapp。我是否正确使用userdefault存储用户密钥在注册期间?然后让我说我有一个registerviewcontroller.swift和一个userviewcontroller.swift,如何从userviewcontroller.swift调用存储在registerviewcontroller.swift中的userdefault用户数据?
我正在使用ios 11和swift 4。 请帮忙。谢谢。
答案 0 :(得分:0)
声明了这样的内容。
let userName=dict["user_name"] as? String
UserDefaults.standard.set(userName, forKey: "user_name")
来自userviewcontroller.swift的像这样使用
let userName = UserDefaults.standard.string(forKey: "user_name")
答案 1 :(得分:0)
在userdefault中保存和检索userinfo,你需要像
这样的东西class Helper {
static func setUserInfo( userinfo: UserInfo?) {
if let info = userinfo {
UserDefaults.standard.setValue(NSKeyedArchiver.archivedData(withRootObject: info), forKey: "USERINFO")
}
else {
UserDefaults.standard.setValue(nil, forKey: "USERINFO")
}
UserDefaults.standard.synchronize()
}
static func getUserInfo() -> UserInfo? {
if let data = UserDefaults.standard.value(forKey: "USERINFO") {
return (NSKeyedUnarchiver.unarchiveObject(with: data as! Data) as! UserInfo)
}
return nil
}
}
这里是userInfo类//这里我使用的是objectmapper lib,你可能/不需要相应的
class UserInfo: NSObject, NSCoding, Mappable {
var patientId: String?
var authKey : String?
override init() {
super.init()
}
required init?(map: Map){
}
func mapping(map: Map) {
patientId <- map["patient_id"]
authKey <- map["authKey"]
}
required init?(coder aDecoder: NSCoder) {
patientId = aDecoder.decodeObject(forKey: "patientId") as? String
authKey = aDecoder.decodeObject(forKey: "authKey") as? String
}
func encode(with aCoder: NSCoder) {
aCoder.encode(patientId, forKey: "patientId")
aCoder.encode(authKey, forKey: "authKey")
}
}
现在在注册视图控制器中,在viewdidload方法
中if let _ = Helper.getUserInfo() { // there is user logged in, i.e. user installed the app and registered earlier
if let mainModuleTabBar = StoryboardHelper.mainModuleStory().instantiateViewController(withIdentifier: MyTabBarController.controllerIdentifier) as? MyTabBarController {
let window = (UIApplication.shared.delegate as! AppDelegate).window
window?.rootViewController = mainModuleTabBar
window?.makeKeyAndVisible()
}
return
}
答案 2 :(得分:0)
您在Userdefaults中存储的内容可在整个应用程序中访问。它与任何特定的视图控制器有关。
Userdefaults以plist文件的形式存储在应用程序的Data Container中。
存储用户默认值
UserDefaults.standard.setValue("<Value>", forKey: "<Key>")
UserDefaults.standard.synchronize()
访问用户默认值
UserDefaults.standard.value(forKey: "<Value>")
答案 3 :(得分:0)
保存整数,布尔值,字符串,数组,字典,日期等等,但是请注意不要保存太多数据,因为它会减慢Swift 4中应用程序的启动速度
let defaults = UserDefaults.standard
defaults.set(25, forKey: "intkey")
defaults.set(true, forKey: "boolkey")
defaults.set(CGFloat.pi, forKey: "floatkey")
defaults.set("Paul Hudson", forKey: "stringkey")
defaults.set(Date(), forKey: "datestore")
答案 4 :(得分:-1)
要在userdefaults中保存和检索值,应在util方法下使用。
import UIKit
class PersistanceManager: NSObject {
/// Set value in user defaults
///
/// - Parameter key: key for which value to be saved in user defaults
/// - Returns: value to save in user default
static func getPersistenceValueForKey(key : String) -> Any?{
if let value = UserDefaults.standard.value(forKey: key){
return value
}
return nil
}
/// Retrieve value from user default for the key
///
/// - Parameters:
/// - value: value fetched for the key from user defaults
/// - key: key for which value to be retrived
static func setPersistence(value : Any? , forKey key:String){
if !key.isEmpty {
if let value = value {
UserDefaults.standard.setValue(value, forKey: key)
UserDefaults.standard.synchronize()
}
else {
UserDefaults.standard.removeObject(forKey: key)
}
//Doing the syncronize in async queue. performance Fix
let persistenceQueue = DispatchQueue(label: "ID")
persistenceQueue.async(execute: {() -> Void in
UserDefaults.standard.synchronize()
})
}
}
}