存储UISwitch状态的问题
我在我的应用程序中有一个设置,我遇到了保留状态的问题。基本上,默认情况下,UISwitch是打开的,但是当我的应用程序更新到新版本时,它似乎关闭。我发现如果用户在1.0版中打开了设置菜单,那么这不是问题,但是如果他们从未改变设置,甚至打开设置菜单,那么这是一个问题。因此,它一定是viewWillAppear()
某处的问题,但我无法弄清楚它是什么。我用于存储开关状态的代码看起来真的太复杂了。存储UISwitch状态的问题
这是我在我的设置菜单代码:
@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")
}
我声明的布尔“其autoAdjust”在不同的视图控制器为全局变量。在viewWillAppear()
同一视图控制器我有这样的代码:
autoAdjust = NSUserDefaults.standardUserDefaults().boolForKey("autoAdjustSettings")
任何人都可以提出同时也有它在默认情况下,当应用程序首次启动存储开关状态的更好的办法?或修复我目前的解决方案。
NSUserDefaults.standardUserDefaults().boolForKey("key")
默认为false。因此,就像你的情况一样,如果用户从不设置密钥,那么它将是错误的,并且开关将默认关闭。
取而代之,重命名该键并将其用作否定。相反,将其称为autoAdjustSettingsOff
,它将默认为false,并且该开关将默认为打开。不要忘记切换条件块中的真/假设置。
太棒了!非常感谢。 – user3746428 2014-11-06 23:25:14
不知道这是否过度杀死(或只是愚蠢)。但为什么不使用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实体中。
以下FUNC添加到您的appDelegate(如果尚未有):
func applicationDidEnterBackground(application: UIApplication) {
}
编辑我必须去工作,当我回家将完成ANWSER休息。真对不起。
我会试试这个,但我目前没有CoreData的使用经验,现在需要快速修复。不管怎么说,还是要谢谢你! – user3746428 2014-11-06 21:52:13
@the_pantless_coder向他展示如何去做 – meda 2014-11-06 21:57:09
@ user3746428明天晚些时候我会回到家,当我与xcode合作时会发布一个完整的答案。在此期间尝试本教程http://www.youtube.com/watch?v=3IDfgATVqHw – 2014-11-07 00:09:04
在将任何值存储到NSUserDefaults后,尝试使用'NSUserDefaults.standardUserDefaults()。synchronize()'。 – Kirsteins 2014-11-04 11:25:08