首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSUserDefaultsController:“尝试将非属性列表对象...设置为键的NSUserDefaults/CFPreferences值...”

NSUserDefaultsController:“尝试将非属性列表对象...设置为键的NSUserDefaults/CFPreferences值...”
EN

Stack Overflow用户
提问于 2019-01-26 13:19:47
回答 1查看 291关注 0票数 0

我正在尝试使用NSUserDefaultsController在我的Swift macOS应用程序中实现一个首选项窗口。

我需要持久化的设置之一是一个预置数组,由以下类定义:

代码语言:javascript
复制
class Preset: NSObject {
    var name = "abc"
    var value = 123

    override init() {
        super.init()
    }
}

因此,我需要持久化一个[Presets]类型的变量。我首选项窗口中的可视化表示是一个绑定到NSArrayControllerNSTableView

我按照this教程来设置我的绑定。当运行应用程序并尝试添加新的预设(通过单击+按钮)时,我收到以下错误:

代码语言:javascript
复制
[User Defaults] Attempt to set a non-property-list object (...) as an NSUserDefaults/CFPreferences value for key presets
[General] Attempt to insert non-property list object (...) for key presets

我已经尝试实现了CodableNSCoding协议,但是错误仍然存在。

通过在堆栈溢出(如thisthis)中搜索类似的问题,似乎解决方案将涉及NSKeyedArchiverNSKeyedUnarchiver。如果您手动触发加载和保存,这看起来很简单。不幸的是,我不知道如何将这些类与NSUserDefaultsController一起使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-28 19:48:42

我通过将NSArrayController子类化如下解决了这个问题(参见Hamish对my other question的评论,这是拼图中缺少的最后一块,使其成为通用的):

代码语言:javascript
复制
extension Encodable {
    fileprivate func encode(to container: inout SingleValueEncodingContainer) throws {
        try container.encode(self)
    }
}

struct AnyEncodable: Encodable {
    var value: Encodable
    init(_ value: Encodable) {
        self.value = value
    }
    func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try value.encode(to: &container)
    }
}

class NSEncodableArrayController: NSArrayController {
    override func addObject(_ object: Any) {
        let data = try! PropertyListEncoder().encode(AnyEncodable(object as! Encodable))
        let any = try! PropertyListSerialization.propertyList(from: data, options: [], format: nil)

        super.addObject(any)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54375863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档