存储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")

有人能建议一种更好的方法来存储开关状态,同时在应用程序首次启动时默认打开开关吗?或者修复我当前的解决方案。

NSUserDefaults.standardUserDefaults().boolForKey("key")默认为false。因此,在您的情况下,如果用户从未设置密钥,那么它将是错误的,并且开关将默认为关闭

相反,重命名关键点并将其用作负数。因此,将其称为autoAdjustSettingsOff,它将默认为false,开关将默认为on。不要忘记在条件块中切换true/false设置。

不确定这是过度杀戮(还是愚蠢)。但是为什么不使用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数据模型并执行以下操作。

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。您现在可以根据需要保存/编辑/删除数据。例如,当您需要加载所有保存的用户设置时,应用程序将变为活动状态。

在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实体中保存一个新条目。

将以下函数添加到您的appDelegate中(如果还没有):

func applicationDidEnterBackground(application: UIApplication) {
}

编辑:我必须去上班,回家后我会完成剩下的工作。真的很抱歉。

最新更新