我的应用程序中有一个设置,在保留状态时遇到问题。基本上,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) {
}
编辑:我必须去上班,回家后我会完成剩下的工作。真的很抱歉。