将字典保存到 NSUserDefaults 中

2023-11-30

class AddElementVC: UIViewController {

    // textfields and some other functions are defined here 

    @IBAction func addElement(sender: UIBarButtonItem) {

        let newElement = Element(/* properties are defined here */)
        var theDict = NSUserDefaults.standardUserDefaults().dictionaryForKey(tableViewData) as [String: [Element]]

        if var theArray = theDict[newElement.someProperty] {
            theArray += newElement
            theDict[newElement.someProperty] = elementArray
        } else{
            theDict[newElement.someProperty] = [newElement]
        }

        NSUserDefaults.standardUserDefaults().setObject(theDict, forKey: tableViewData)

    }
}

上面代码的解释:

我的 tableView-app 从 [String: [Element]] 类型的字典(Element 是一个自定义类)接收数据,该字典是从 userDefaults 加载的。在第二个 viewController 中,您可以填写一些文本字段,最后按 UIBarButtonItem。根据 textFields 的数据,创建“Element”类的新实例,并将其添加到“theDict”中“newElement”属性之一的键处。当我使用控制台输出检查它时,所有这些都工作正常,但我无法最终将编辑后的字典保存在 userDefaults 中。没有语法错误,但是当我使用该应用程序并尝试通过第二个 viewController 将另一个元素添加到字典时,会显示以下错误:

错误信息:

NSForwarding:警告:类“_TtC12myApp7Element”的对象 0xdcb002c 未实现 methodSignatureForSelector:-- 前方有麻烦

研究并没有帮助我理解错误消息。

EDIT

import Foundation

class Element: NSCoding {

enum State: String {
    case state1 = "state1"
    case state2 = "state2"
}

let state: State
// some more properties

init(state: String /* something more */ ){
    self.state = State.fromRaw(state)!
    // something more
}

init(coder aDecoder: NSCoder!) {
    self.state = aDecoder.decodeObjectForKey("state") // displays error: 'AnyObject' is not convertible to 'Element.State'
    // something more
}

func encodeWithCoder(aCoder: NSCoder!) {
    aCoder.encodeObject(self.state, forKey: "state") // displays error: Extra Argument 'forKey' in call
    // something more
}

}

来自NSUserDefaults 文档:

value参数只能是属性列表对象:NSData, NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,其内容必须是属性列表对象。 看“什么是财产清单?” in 属性列表编程指南.

您不能存储包含以下元素的字典Element在字典里。

一种选择是确保Element实施NSCoding协议然后使用NSKeyedArchiver将字典转换为 NSData:

// Storing the dictionary
var data = NSKeyedArchiver.archivedDataWithRootObject(theDict)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: tableViewData)

// Retrieving the dictionary
var outData = NSUserDefaults.standardUserDefaults().dataForKey(tableViewData)
var dict = NSKeyedUnarchiver.unarchiveObjectWithData(outData)

你的协议实现看起来像这样:

init(coder aDecoder: NSCoder!) {
    self.state = State.fromRaw(aDecoder.decodeObjectForKey("state") as String)
}

func encodeWithCoder(aCoder: NSCoder!) {
    aCoder.encodeObject(self.state.toRaw(), forKey: "state")
}

您无法存储枚举,但可以存储它的原始表示形式,即字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字典保存到 NSUserDefaults 中 的相关文章

随机推荐

  • JSF RichTable 合并标题中的行/列

    我想做的是做这个布局RichTable在其标题中有 3 列 3 5 1 2 4 6 我已经习惯了this 8 2 完成任务的资源 富脸4 0 0 但相反 我最终得到了没有任何合并的普通表行 您能解释一下吗 Update 关于来自的答案瓦西尔
  • 多个组件 - 性能损失?

    我有一个清单System IO Ports SerialPort一个程序集中的对象 并且我计划处理来自另一个程序集的 Data Receieved 事件 我想知道这是否会以某种方式影响性能 会吗 恐怕我不太清楚 CLR 如何管理程序集 谢谢
  • 从 VS 05 中的资源设置应用程序图标

    我知道我可以将图标添加到项目的 Resources resx 文件中 然后从代码中引用该图标 如何从资源中设置整个EXE的图标 我所看到的只是浏览另一个文件的地方 我想使用我的资源中的当前图标文件 而不必在我的项目中拥有重复的文件 than
  • 如何将两个独立但相似的代码库合并到一个 SVN 代表中?

    I have www example com 上的 var www cool codebase 并且我有 www example net 上的 var www cool codebase 代码库适用于在不同服务器上运行的同一 Web 应用程
  • 将 nil 排序到可选字符串数组的末尾

    如果我有一个可选字符串数组 并且我想以 nils 开头按升序对它进行排序 我可以在一行中轻松完成 b nil a sorted 0 lt 1 nil a b 但似乎没有任何类似简单的解决方案可以将 nil 排序到end数组的 使用大多数其他
  • 是否有 Visual Studio 插件的配置类型文件?

    创建 Visual Studio 加载项时 如何利用该加载项的 app config 如果我向项目添加一个并部署它 那么当加载项运行并且我以编程方式尝试通过 ConfigurationManager AppSettings 访问它时 它不会
  • xargs 在搜索中尊重通配符

    我有一个名为 file1 txt 的文件 dir1 dir2 dir3 我想使用 xargs 检查某些文件是否存在于文件系统中 如下所示 cat file1 txt xargs i ls projects analysis7 meta bw
  • IHttpContextAccessor.HttpContext.User.Identity 显示 CurrentUserService 服务中的所有 null 属性

    我正在尝试使用Jason Taylor 的简洁架构模板 这个模板使用 NSwag 自动创建 TypeScript 客户端 Angular 但我不需要创建 TS 客户端 所以我的主要目标是用 Razor Pages 替换它 我已经能够取得高分
  • Cocoa:每次方法调用都会中断?

    通常 在调试时 了解以什么顺序调用类的哪些方法对我来说很重要 天真的解决方案 到目前为止我一直在使用 是弹出一个NSLog在每个方法的顶部 但这是耗时的 重复的 丑陋的 并且如果我在调试后忘记删除日志 会让我的代码看起来很幼稚 一个更干净的
  • Toast 不从列表中选定的项目生成文本

    我在android中用列表视图制作了一个简单的应用程序 因为我想在选择一个项目时进行吐司 我已经尝试如下 但它不起作用 我的代码如下 main java package com example listview import java ut
  • ZF2 骨架应用程序抛出 500 错误

    当尝试使用以下命令部署骨架应用程序时 git clone git github com zendframework ZendSkeletonApplication git cd ZendSkeletonApplication php com
  • 将数组传递给 useEffect 依赖项列表

    每 5 秒长轮询会产生一些数据 我希望我的组件在每次数组的一项 或数组长度本身 发生变化时调度一个操作 在将数组作为依赖项传递给 useEffect 时 如何防止 useEffect 进入无限循环 但如果任何值发生变化 仍然设法调度一些操作
  • 运算符和方法之间的区别

    运算符和方法之间有本质区别吗 我看到的唯一区别是它们的调用方式 它们还有其他区别吗 例如在Python中连接 切片 索引被定义为运算符 而 指字符串 upper replace strip 等等都是方法 如果我正确理解问题 简而言之 一切都
  • Python pygame 未安装

    C Users matth gt pip3 安装 pygame 收集pygame 使用缓存的 pygame 2 1 2 tar gz 10 1 MB 准备元数据 setup py 错误 错误 子进程退出并出现错误 python setup
  • Javascript 和 RegEx:分割​​并保留分隔符

    我有一个正则表达式 它将把我的字符串分割成数组 一切工作正常 除了我想保留分隔符的一部分 这是我的正则表达式 a zA Z0 9 s 在 JavaScript 中 我正在做 var test paragraph split a zA Z0
  • 有没有办法使用 ServiceTask 在控制台应用程序中托管 Razor 页面?

    我正在尝试创建一个控制台应用程序来公开 JSON 服务 另外我想托管 html 和 js 页面来使用它们 我将 md 甚至 htm 文件放入 Views 文件夹中 但我无法访问它们 如果我添加一条路线 Add Test 其中 MyMarkd
  • 46 个 SQL 加载程序的控制文件

    我必须使用 SQL Loader for Oracle 加载 46 个表的数据 所有数据文件均为 CSV CSV 中的列顺序与表中的列顺序匹配 我需要为每个表创建一个控制文件 我批量生产这些文件的最佳方法是什么 我知道这是一个老问题 但它仍
  • Android DexClassLoader 错误,“优化数据目录..不属于当前用户”

    我正在尝试生成一个简单的 Android 应用程序 可以在运行时从 SD 卡加载 DEX 文件 该应用程序有两个活动 第一个活动是一个带有按钮的简单屏幕 当按下按钮时 将启动第二个活动 从而调用 loadDex 方法 loadDex 方法尝
  • 如何初始化相互引用的结构体字段

    我目前想定义一个结构体Piston使用 GamerIterator 进行游戏 pub struct MyGame lt a gt game window GameWindowGLFW game iter GameIterator lt a
  • 将字典保存到 NSUserDefaults 中

    class AddElementVC UIViewController textfields and some other functions are defined here IBAction func addElement sender