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 
这是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
        }
    }
}
并且这里最终将成为我的主要和初始 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
        }
    }
小智 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()
2) 从 UserDefault 检索对象
let decoded  = userDefaults.object(forKey: "groups") as! Data
let decodedGroups = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Group]
| 归档时间: | 
 | 
| 查看次数: | 3044 次 | 
| 最近记录: |