将对象存储在用户默认值 swift 中

Cod*_*ing 0 nsuserdefaults ios swift

我是 swift 的新手,并试图找出存储用户默认值的最佳方式。这是我的应用程序的 3 个初始 VC 类,我将数据从登录视图传递到开始您的计划视图,再到用户信息(配置文件视图)——这是我需要为用户存储默认值的地方。我的问题是 - 存储的唯一用户默认值是“姓名”和“月薪”似乎也有效。但是“每日预算默认值”和“每日储蓄默认值”(双打)似乎没有存储并出现在第三个屏幕(用户配置文件)上。我没有得到正确的参考。

第一段代码来自登机视图控制器,我在那里收集他们的信息 - 为了简短起见,我只显示了 calculateData IBAction。截至目前 - 这是我试图获取他们的用户默认值的地方。

信息的第二个 VC是在登机后直接查看的视图,用户可以在其中查看他们的信息 - 一旦他们从这个 VC 开始 - 我创建一个新的用户对象(我应该只创建一个新用户对象的数组并将其存储在 NSUserDefaults 下这里?)

第三个 VC - 这是实际的用户配置文件,我需要在其中显示所有用户默认值。我将把它设置为初始视图控制器并在应用程序委托中设置,如果用户之前已经完成了登录屏幕,则首先加载此页面。

请并感谢您的任何帮助!

 import UIKit

 class ViewController: UIViewController, UITextFieldDelegate{

   @IBAction func calculateDataButtonPressed(_ sender: UIButton) {

    customerName = nameTextField.text!


    if let payTotal = Double(monthlyAmountTextField.text!){
        monthlyEarning = payTotal
    }

    if let savingsNumber = Double(desiredSavingsTextField.text!){
        desiredSavingsAmount = savingsNumber

    }

    else {
        displayLabel.text = "Enter input as so: 1299.39"

    }


    budgetForEachDay = ((monthlyEarning - desiredSavingsAmount) / 4.0) / 7.0
    savingsForEachDay = (desiredSavingsAmount / 4.0) / 7.0


    UserDefaults.standard.set(nameTextField.text, forKey: "name")
    UserDefaults.standard.set(monthlyAmountTextField.text, forKey: "monthlyPay")
    UserDefaults.standard.set(savingsForEachDay, forKey: "dailySavingsDefault")
    UserDefaults.standard.set(budgetForEachDay, forKey: "dailyBudgetDefault")
    //THE 4 USER DEFAULTS I NEED TO SAVE 
Run Code Online (Sandbox Code Playgroud)

这是SEGUE加载的下一个类-我在这里创建了一个新的用户对象-我是否应该将用户默认值存储在一个newUserObject数组中,而不是我想怎么做?

import UIKit

class StartYourPlanViewController: UIViewController {

    var nameFieldPassedOver : String?
    var monthlyEarningPassedOver : Double?
    var desiredSavingsPassedOver : Double?
    var budgetToSpend : Double = 55.3
    var saveEachDay : Double = 55.5



    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var monthtlyEarningLabel: UILabel!
    @IBOutlet weak var desiredSavingsLabel: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

        nameLabel.text = nameFieldPassedOver

        monthtlyEarningLabel.text = "\(monthlyEarningPassedOver!)" 
        monthtlyEarningLabel.isHidden = true

        desiredSavingsLabel.text = "\(desiredSavingsPassedOver!)"
        desiredSavingsLabel.isHidden = true


    }


    func makeNewUserObject(){

        let newUser = UserInfo(name: nameFieldPassedOver!, iWantToSave : desiredSavingsPassedOver!, monthlyIncome: monthlyEarningPassedOver!, budgetEachDay : budgetToSpend, youSaveEachDay : saveEachDay)


        newUser.printUserBio()

    }


    @IBAction func startPlanButtonPressed(_ sender: UIButton) {


        makeNewUserObject()



        performSegue(withIdentifier: "GoToYourUserInfoView", sender: self)

    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {


       if segue.identifier == "GoToYourUserInfoView"{

           let userInfoVC = segue.destination as! UserInfoViewController


            userInfoVC.userNamePassedOver = nameFieldPassedOver
            userInfoVC.userDailyBudgetPassedOver = budgetToSpend
            userInfoVC.userMonthlyEarningsPassedOver = monthlyEarningPassedOver
            userInfoVC.userDesiredSavingsPassedOver = desiredSavingsPassedOver
            userInfoVC.userDailySavingsPassedOver = saveEachDay

        }

    }


}
Run Code Online (Sandbox Code Playgroud)

并且这里最终将成为我的主要和初始 VC - 我在其中为他们显示用户信息。我需要设置用户默认值的默认值,以便每次现有用户打开应用程序时它们都会出现在此页面上

class UserInfoViewController : ViewController {

    var userNamePassedOver : String?
    var userDailyBudgetPassedOver : Double?
    var userDailySavingsPassedOver : Double?
    var userMonthlyEarningsPassedOver : Double?
    var userDesiredSavingsPassedOver : Double?
    var newAmountPassedBack : Double = 0.0

    let monthlyPay = "monthlyPay"
    let name = "name"
    let dailySavingsDefault = "dailySavingsDefault"
    let dailyBudgetDefault = "dailyBudgetDefault"


    @IBOutlet weak var dailySavingsNumberLabel: UILabel!
    @IBOutlet weak var userNameLabel: UILabel!
    @IBOutlet weak var dailySpendingLimitLabel: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()



        if let name = UserDefaults.standard.value(forKeyPath: name) as? String{
            userNameLabel.text = name
        }

        if let monthlyPay = UserDefaults.standard.value(forKeyPath: monthlyPay) as? String{

            userMonthlyEarningsPassedOver = Double(monthlyPay)

        }

      if let dailySavingsDefault = UserDefaults.standard.value(forKeyPath: dailySavingsDefault) as? String{



            dailySavingsNumberLabel.text = dailySavingsDefault



        }

       if let dailyBudgetDefault = UserDefaults.standard.value(forKeyPath: dailyBudgetDefault) as? String {

            dailySpendingLimitLabel.text = dailyBudgetDefault


        }


    }
Run Code Online (Sandbox Code Playgroud)

小智 5

最初,您必须将对象存档到 NSData 中,然后我们可以将其保存到 UserDefault 并在需要时从 UserDefault 中检索它。

示例如下所示:-

1) 将对象保存到 UserDefault

let groups = [Group(id: 1, name: "group1", shortname: "g1"), Group(id: 2, name: "group2", shortname: "g2")]

var userDefaults = UserDefaults.standard
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: groups)
userDefaults.set(encodedData, forKey: "groups")
userDefaults.synchronize()
Run Code Online (Sandbox Code Playgroud)

2) 从 UserDefault 检索对象

let decoded  = userDefaults.object(forKey: "groups") as! Data
let decodedGroups = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Group]
Run Code Online (Sandbox Code Playgroud)