Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将对象存储在用户默认设置中_Ios_Swift_Nsuserdefaults - Fatal编程技术网

Ios 将对象存储在用户默认设置中

Ios 将对象存储在用户默认设置中,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,我是swift新手,正在尝试找出存储用户默认值的最佳方法。下面是我的应用程序的3个初始VC类,我将数据从“入职”视图传递到“启动您的计划”视图,再传递到“用户信息”(纵断面图)——这是我需要为用户存储默认值的地方。我的问题是-唯一的用户默认存储是“姓名”和“月薪”似乎也能正常工作。但是“每日预算默认值”和“每日储蓄默认值”(双倍)似乎没有存储并出现在第三个屏幕上(用户配置文件)。我没有得到正确的参考资料 第一段代码来自我收集他们信息的Onboard view controller,为了简短起见,

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

第一段代码来自我收集他们信息的Onboard view controller,为了简短起见,我只显示calculateData iAction。到目前为止,这就是我试图获取他们的用户默认值的地方

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

3rd 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加载的下一个类——我在这里创建了一个新的用户对象——我是否应该将用户默认值存储在一个新的UserObject数组中,而不是尝试如何进行存储

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


        }


    }

设置数据为
userdefault
后,必须同步
userdefault
,以便
userdefault
保存挂起的数据。确保您的
userdefault
标识符没有任何打字错误。

当您将数据设置为
userdefault
之后,您必须同步
userdefault
,以便
userdefault
保存挂起的数据。确保您不会在
userdefault
标识符上出现任何打字错误。

首先,您必须将对象归档到NSData中,然后我们可以将其保存到userdefault,并在需要时从userdefault中检索

示例如下所示:-

1) 将对象保存到用户默认值

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()
let decoded  = userDefaults.object(forKey: "groups") as! Data
let decodedGroups = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Group]
2) 从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()
let decoded  = userDefaults.object(forKey: "groups") as! Data
let decodedGroups = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Group]

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

示例如下所示:-

1) 将对象保存到用户默认值

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()
let decoded  = userDefaults.object(forKey: "groups") as! Data
let decodedGroups = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Group]
2) 从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()
let decoded  = userDefaults.object(forKey: "groups") as! Data
let decodedGroups = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Group]

如果要在UserDefault上存储结构:

// Save the selected timeZone on UserDefaults
    if let encodedCity = try? JSONEncoder().encode(cityAndTimeZone) {
       UserDefaults.standard.set(encodedCity, forKey: "cityAndTimeZone")
    }


// To restore struct from UserDefaults
if let decodedData = UserDefaults.standard.object(forKey: "cityAndTimeZone") as? Data {
        if let cityAndTimeZone = try? JSONDecoder().decode(CityAndTimeZone.self, from: decodedData) {
            timezoneLabel.text = cityAndTimeZone.city
        }
    }

如果要在UserDefault上存储结构:

// Save the selected timeZone on UserDefaults
    if let encodedCity = try? JSONEncoder().encode(cityAndTimeZone) {
       UserDefaults.standard.set(encodedCity, forKey: "cityAndTimeZone")
    }


// To restore struct from UserDefaults
if let decodedData = UserDefaults.standard.object(forKey: "cityAndTimeZone") as? Data {
        if let cityAndTimeZone = try? JSONDecoder().decode(CityAndTimeZone.self, from: decodedData) {
            timezoneLabel.text = cityAndTimeZone.city
        }
    }

您的实际需求是什么??让你的问题简洁明了,让每个人都能阅读和理解。很抱歉,现在是凌晨3点,我已经看了6个小时的代码了。这正是我需要做的。在注册页面上,我有来自用户的3个输入-他们的姓名、月收入和期望的储蓄金额。通过这3个输入,我可以计算每日预算和每日储蓄金额(您可以在我的第一个VC中看到,直接在用户默认值之上)。我需要将所有这些存储在用户默认值中,因为每次用户打开应用程序时,我都需要将这些数据呈现给用户。我对是否应该将用户默认值存储在对象数组中感到困惑(因为此对象将已保存所有这些数据-请参阅第二类“newUser”对象)。。或者,当用户在车载屏幕(first View Controller)上输入数据时,我是否创建用户默认值?您可以告诉我屏幕顺序吗?当然可以-第一个屏幕是车载屏幕,它有3个简单的文本输入-姓名、月薪和期望的储蓄。我还在这个屏幕上计算每日预算和每日储蓄目标。第二个屏幕是他们确认并单击“启动我的储蓄计划”的地方-在IBAction中启动他们的计划,我创建一个新的用户对象,该对象包含名称、他们想要储蓄的金额、月收入、每日支出预算和每日储蓄。第三个屏幕是他们的个人资料-这是我需要显示他们的用户默认值的地方,因为这将是最初的VC。你的实际需求是什么??让你的问题简洁明了,让每个人都能阅读和理解。很抱歉,现在是凌晨3点,我已经看了6个小时的代码了。这正是我需要做的。在注册页面上,我有来自用户的3个输入-他们的姓名、月收入和期望的储蓄金额。通过这3个输入,我可以计算每日预算和每日储蓄金额(您可以在我的第一个VC中看到,直接在用户默认值之上)。我需要将所有这些存储在用户默认值中,因为每次用户打开应用程序时,我都需要将这些数据呈现给用户。我对是否应该将用户默认值存储在对象数组中感到困惑(因为此对象将已保存所有这些数据-请参阅第二类“newUser”对象)。。或者,当用户在车载屏幕(first View Controller)上输入数据时,我是否创建用户默认值?您可以告诉我屏幕顺序吗?当然可以-第一个屏幕是车载屏幕,它有3个简单的文本输入-姓名、月薪和期望的储蓄。我还在这个屏幕上计算每日预算和每日储蓄目标。第二个屏幕是他们确认并单击“启动我的储蓄计划”的地方-在IBAction中启动他们的计划,我创建一个新的用户对象,该对象包含名称、他们想要储蓄的金额、月收入、每日支出预算和每日储蓄。第三个屏幕是他们的个人资料-这是我需要显示他们的用户默认值的地方,因为这将是最初的VC