我的应用中有一个设置,我有问题保留状态。基本上,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")
任何人都可以建议一种更好的存储交换机状态的方法,同时默认情况下在应用首次启动时启用它吗?或修复我目前的解决方案。
答案 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。不要忘记在条件块中切换真/假设置。