【问题标题】:Not able to set NSUserDefaults无法设置 NSUserDefaults
【发布时间】:2017-01-14 18:40:33
【问题描述】:

我已经构建了一个用于管理设备的应用程序。我在应用程序启动时使用 NSUserDefaults 设置了服务器名称、服务器端口、UDID、ErID 和 Language_pack_enabled 等详细信息。但是当我尝试运行该应用程序时,它崩溃了,说明这是一个错误的指令,当我调试它时,用户默认设置为 nil 。谁能告诉我如何将服务器名称、端口和 ErID 设置为设备配置文件中的设备

(设置 -> 常规 -> 设备管理 -> 查看详细信息)。

我的代码如下

let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
    let dict : AnyObject = userDefaults.objectForKey(mdmiosagent_Constants.MANAGED_APP_CONFIGURATION)!

    let serverName = dict[mdmiosagent_Constants.SERVERNAMEKEY] as! NSString?
    let serverPort = dict[mdmiosagent_Constants.SERVERPORTKEY] as! NSString?
    let UDID = dict[mdmiosagent_Constants.UDIDKEY] as! NSString?
    let languagePack = dict[mdmiosagent_Constants.IS_LANG_PACK_ENABLED] as! NSString?
    let ErID = dict[mdmiosagent_Constants.ERIDKEY] as! NSString?

【问题讨论】:

  • 抱歉,排版错误。
  • 请分享您在 NSUserDefaults 中设置值的代码。
  • if serverName != nil && serverPort != nil && UDID != nil { persist.setObject(UDID!, forKey: "(mdmiosagent_Constants.UDIDKEY)") persist.setObject(serverName!, forKey: "(mdmiosagent_Constants.SERVERNAMEKEY)") persist.setObject(serverPort!, forKey: "(mdmiosagent_Constants.SERVERPORTKEY)") persist.setObject(ErID!, forKey: "(mdmiosagent_Constants.ERIDKEY)")
  • 如果您已经定义了常量,那么为什么在用户默认值中设置对象时将它们放在引号中/
  • 您也正在使用键“mdmiosagent_Constants.MANAGED_APP_CONFIGURATION”获取值,并且您没有在 userdefaults 中使用此键设置任何值??

标签: ios swift


【解决方案1】:

根据您的数据格式,我建议您创建一个包含所有数据的字典,然后请尝试以下操作:

NSUserDefaults.standardUserDefaults().setObject(dict, forKey: mdmiosagent_Constants.MANAGED_APP_CONFIGURATION)

检查您是否能够在 userDefaults 中为键 mdmiosagent_Constants.MANAGED_APP_CONFIGURATION 设置值

【讨论】:

  • 我使用 if let 语句对其进行了检查,但我无法在用户默认值中为键“mdmiosagent_Constants.MANAGED_APPLICATION_CONFIGURATION”设置值
  • 基本上所有这些变量(serverName,serverPort,...)都是从安装配置文件 pList 中推送的。访问它们的关键是设置的“com.apple.configuration.managed”到常量 MANAGED_APP_CONFIGURATION。那么任何人都可以告诉我如何访问该 plist 中的数据并将其设置为此处的变量吗?
【解决方案2】:

为了将值存储在字典中,您必须在将字典设置为字典之前检查 nil 并替换为 ""(some default value) 不允许任何键的 nil 值,因此如果任何键是,则不会在 userdefaults 中设置字典字典中的空白

您可以使用一些默认值(例如“”或类似的东西)设置所有值,将其存储在 NSUserDefaults 中,之后当您获得实际值更新 NSUserDefaults 中的值时,您将至少有一些value 并且不会被视为 nil

像这样:

let userDefault = NSUserDefaults.standardUserDefaults()
userDefault.setObject("", forKey:mdmiosagent_Constants.UDIDKEY)
userDefault.setObject("", forKey: mdmiosagent_Constants.SERVERNAMEKEY) 
userDefault.setObject("", forKey: mdmiosagent_Constants.SERVERPORTKEY) 
userDefault.setObject("", forKey:mdmiosagent_Constants.ERIDKEY)
userDefault.setObject("", forKey:mdmiosagent_Constants.MANAGED_APP_CONFIGURATION)
userDefault.synchronize()

然后你可以在获得真正价值时使用相同的代码进行更新

在检索的时候你可以检查userdefault中是否有内容还是空白

如果你的值是 UDIDKEY 中的字符串,就像这样

let userDefault = NSUserDefaults.standardUserDefaults()
userDefault.synchronize()
ket strUdid = userDefault.objectForKey(mdmiosagent_Constants.UDIDKEY)

if (strUdid.characters.count > 0) {
//get the value
}

// 或者第二种方式

if (strUdid != "") {
//get the value
}

如果您的对象可以是任何对象,您可以检查第二个选项或在对象内检查任何特定键的 nil

正如 Ujjwal 所说,您没有在代码中设置 mdmiosagent_Constants.MANAGED_APP_CONFIGURATION 的值,并且在检索时您正在从密钥中获取数据,因此它在启动时发现 nil 因此,您可以将所有键都像您在评论中所写的那样单独设置,或者在特定键中设置值,而不是存储在单个键中

【讨论】:

  • 基本上所有这些变量(serverName,serverPort,...)都是从安装配置文件 pList 中推送的。访问它们的关键是设置的“com.apple.configuration.managed”到常量 MANAGED_APP_CONFIGURATION。那么任何人都可以告诉我如何访问该 plist 中的数据并将其设置为此处的变量吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多