存储UISwitch状态的问题

时间:2014-11-04 11:06:18

标签: ios swift nsuserdefaults uiswitch

我的应用中有一个设置,我有问题保留状态。基本上,UISwitch默认打开,但是当我的应用程序更新到更新的版本时,它似乎关闭。我发现,如果用户在版本1.0中打开了设置菜单,那么这不是问题,但如果他们从未更改过设置,甚至打开设置菜单,那么这就是一个问题。因此,它必须是viewWillAppear()中的某个问题,但我无法弄清楚它是什么。我用来存储交换机状态的代码看起来真的太复杂了。

这是我在设置菜单中的代码:

@IBAction func dupOffOnSwitch(sender: AnyObject) {
    if dupSwitch.on == true {
        autoAdjust = true
        println(autoAdjust)
    } else {
        autoAdjust = false
        println(autoAdjust)
    }

NSUserDefaults.standardUserDefaults().setBool(autoAdjust, forKey: "autoAdjustSettings")
}

override func viewWillAppear(animated: Bool) {

    autoAdjust = NSUserDefaults.standardUserDefaults().boolForKey("autoAdjustSettings")

    if autoAdjust == true {
        dupSwitch.on = true
    } else {
        dupSwitch.on = false
    }
}

    if userReturnedAuto == false {
        dupSwitch.on = true
        themeSwitch.on = false
        userReturnedAuto = true
        NSUserDefaults.standardUserDefaults().setBool(userReturnedAuto, forKey: "userReturnedAuto")
        NSUserDefaults.standardUserDefaults().setBool(userReturnedAuto, forKey: "autoAdjustSettings")
    }

我宣布bool' autoAdjust'在不同的视图控制器中作为全局变量。在viewWillAppear()中的同一个视图控制器中,我有这个代码:

    autoAdjust = NSUserDefaults.standardUserDefaults().boolForKey("autoAdjustSettings")

任何人都可以建议一种更好的存储交换机状态的方法,同时默认情况下在应用首次启动时启用它吗?或修复我目前的解决方案。

2 个答案:

答案 0 :(得分:1)

不确定这是否过度杀戮(或者只是愚蠢)。但是为什么不使用CoreData来保存所有用户设置。然后当应用程序变为活动状态时(在您的appDelegate中),您可以从这些存储的值设置NSUserDefaults。只是一个想法:)

为了简洁,我只会为一个开关做一个例子,然后你可以填写并添加其余部分。我还假设当交换机改变状态时你将更新NSUserDefaults。当应用程序变为活动状态时,我们将仅更新/保存核心数据,并在应用程序变为活动状态时加载设置。

如果有人看到我遗漏或可以做得更好的事情,请告诉我,我会更新答案。

首先,您需要确保将CodeData库导入视图控制器:

import CoreData

class fooBarViewController: UIViewController {

您需要在核心数据中创建和实体:假设它被称为“设置” 然后,一旦创建了实体,就需要添加一些属性。按“+”符号。 现在添加属性并将名称设置为“dupSwitch”并键入“Boolean”。为您需要存储的每个设置添加属性。

下一步:您需要创建一个新的swift文件。输入NSObject。将其命名为“dataObjects”。 在你的内部你将使用以下代码:(首先删除所有当前代码 - 使其空白)

import UIKit
import CoreData

@objc(settingObj) 
class settingObj: NSManagedObject {

@NSManaged var dupSwitch:NSNumber //do this for each setting
}

接下来,您需要返回CoreData dataModel并执行以下操作。

1. click on "Default" under the section "Configuration"
2. You will then get a list of all your "entities" select "Settings"
3. click on class and edit the field to "settingObj"

现在您已经设置了CoreData。您现在可以根据需要保存/编辑/删除数据。 例如,当app go变为活动状态时,您需要加载所有已保存的用户设置。

在AppDelegate.swift文件中

:导入CoreData库。

 import CoreData

然后添加此功能(如果它尚不存在)

func applicationWillEnterForeground(application: UIApplication) {

}

在“applicationWillEnterForeground”中,您将加载已存储在CoreData中的所有设置

    var results:[settingObj] = []

    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext!
    let req = NSFetchRequest(entityName: "Settings")

    let tapResults = context.executeFetchRequest(req, error: nil)

    if let presentResults = tapResults {
        if let castedResults = presentResults as? [settingObj] {
            for item in castedResults {

                let dupSwitch = item.dupSwitch    
                let settingSwitch = item.whateverElseYouNeedExample 

           //now based on this we can set the NSDefault
           NSUserDefaults.standardUserDefaults().setBool(dupSwitch, forKey: "autoAdjustSettings")
           NSUserDefaults.standardUserDefaults().setBool(settingSwitch, forKey: "whateverElseYouNeedExample")
            }
        }
    }

现在,您要保存用户设置。当应用程序处于活动状态时我会想到它。 首先,我们将检查设置是否已保存。如果是这样,那么我们就会表演 更新。如果没有,我们将在yuor CoreData Entity中保存一个新条目。

将以下func添加到appDelegate(如果还没有):

func applicationDidEnterBackground(application: UIApplication) {

}
当我回到家时,编辑我必须完成工作才能完成其余的工作。非常抱歉。

答案 1 :(得分:1)

NSUserDefaults.standardUserDefaults().boolForKey("key")默认为false。因此,在您的情况下,如果用户从未设置密钥,则它将为false,并且交换机将默认为关闭。

相反,重命名密钥并将其用作否定密钥。因此,将其称为autoAdjustSettingsOff,默认为false,交换机默认为on。不要忘记在条件块中切换真/假设置。