UserDefault для приложения ios

Я создаю приложение и хочу, чтобы пользователь входил в систему до тех пор, пока он не зарегистрирует учетную запись в приложении, пока пользователь не решит удалить учетную запись. Это работает как ватсап. Правильно ли я использую userdefault для хранения ключа пользователя во время регистрации? Затем скажем, у меня есть registerviewcontroller.swift и userviewcontroller.swift, как мне вызвать пользовательские данные по умолчанию, хранящиеся в registerviewcontroller.swift, из userviewcontroller.swift?

Я использую iOS 11 и Swift 4. Пожалуйста, помогите. Спасибо.


person noob    schedule 05.03.2018    source источник
comment
stackoverflow.com/questions/41361372/   -  person Mitesh jadav    schedule 05.03.2018


Ответы (5)


в registerviewcontroller.swift объявить что-то вроде этого.

let userName=dict["user_name"] as? String

 UserDefaults.standard.set(userName, forKey: "user_name")

из userviewcontroller.swift используйте вот так

 let userName  =  UserDefaults.standard.string(forKey: "user_name")
person Ram    schedule 05.03.2018

чтобы сохранить и получить информацию о пользователе в userdefault, вам нужно что-то вроде

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, вам может понадобиться/не понадобиться соответственно

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
    }
person Ashwin Shrestha    schedule 05.03.2018

Все, что вы храните в Userdefaults, доступно во всем приложении. Это связано с любым конкретным контроллером представления.

Пользовательские значения по умолчанию хранятся в виде файла plist в контейнере данных вашего приложения.

Чтобы сохранить пользовательские настройки по умолчанию

UserDefaults.standard.setValue("<Value>", forKey: "<Key>")
UserDefaults.standard.synchronize()

Доступ к настройкам пользователя по умолчанию

UserDefaults.standard.value(forKey: "<Value>")
person Priya    schedule 05.03.2018
comment
UserDefaults.standard.synchronize() не требуется. - person kd02; 05.03.2018
comment
То, что написал @kd02, изложено на странице документации для UserDefaults.synchronize(): этот метод не нужен и не должен использоваться - person jcsahnwaldt Reinstate Monica; 29.06.2019

Сохраняйте целые числа, логические значения, строки, массивы, словари, даты и многое другое, но будьте осторожны и не сохраняйте слишком много данных, потому что это замедлит запуск вашего приложения в 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")
person P.J.Radadiya    schedule 10.04.2018

Чтобы сохранить и получить значение в userdefaults ниже, используйте методы, которые вы должны использовать.

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()
        })
    }
  }
}
person Sumit Kumar    schedule 18.07.2018
comment
.synchronize() устарел, бесполезен и может вызывать проблемы. Это объясняется в текущей документации. Пожалуйста, удалите эту строку из своего ответа (и из ваших кодовых баз). - person Eric Aya; 18.07.2018
comment
То, что написал @ayaio, изложено на странице документации для UserDefaults.synchronize(): этот метод не нужен и не должен использоваться - person jcsahnwaldt Reinstate Monica; 29.06.2019