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

任何人都可以提出同时也有它在默认情况下,当应用程序首次启动存储开关状态的更好的办法?或修复我目前的解决方案。

+0

在将任何值存储到NSUserDefaults后,尝试使用'NSUserDefaults.standardUserDefaults()。synchronize()'。 – Kirsteins 2014-11-04 11:25:08

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

取而代之,重命名该键并将其用作否定。相反,将其称为autoAdjustSettingsOff,它将默认为false,并且该开关将默认为打开。不要忘记切换条件块中的真/假设置。

+0

太棒了!非常感谢。 – 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休息。真对不起。

+0

我会试试这个,但我目前没有CoreData的使用经验,现在需要快速修复。不管怎么说,还是要谢谢你! – user3746428 2014-11-06 21:52:13

+0

@the_pantless_coder向他展示如何去做 – meda 2014-11-06 21:57:09

+1

@ user3746428明天晚些时候我会回到家,当我与xcode合作时会发布一个完整的答案。在此期间尝试本教程http://www.youtube.com/watch?v=3IDfgATVqHw – 2014-11-07 00:09:04