swift - Cocoa 绑定(bind)仅以一种方式工作(NSMutableDictionary)

标签 swift macos nsmutabledictionary cocoa-bindings

我有一个ViewController使用“Note”对象作为实例变量。该变量在 ViewController 之前设置出现。

Note对象包含 customFields NSMutableDictionary<String, String> 。 我将字典的每个值绑定(bind)到 NSTextField字典中 viewWillAppear :

newTextField.bind(.value, to: self, withKeyPath: "note.customFields.\(key)", options: nil)

文本字段正确显示 note.customFields.\(key) 中的值。 但是,如果用户编辑该值并保存,则更改不会反射(reflect)在字典中。 save() (基本上是一个 ManagedObjectContext.save())方法已通过其他字段(绑定(bind)到其他非字典实例变量)进行了测试并且可以正常工作。

字典没有收到更新值是否有原因?

感谢您的帮助:-)

编辑:这是模型中 customFields 的定义:

enter image description here

最佳答案

这里的问题是可变类型(此处 NSMutableDictionary )和核心数据的组合。

这篇文章有帮助:Core Data not saving transformable NSMutableDictionary

这篇文章也有帮助:https://medium.com/@rohanbhale/hazards-of-using-mutable-types-as-transformable-attributes-in-core-data-2c95cdc27088

解决方案摘要

正如上面提到的第一个链接中所建议的,我尝试通知 Core Data 我的 NSMutableDictionary 中的更改使用note.valueDidChange(forKey: "customFields")但它无法正常工作

所以我最终使用了第一个链接中的第二个命题,这与第二个链接中提出的解决方案相同:

  • 使用 NSDictionary作为可变形类型
  • 当您需要修改此词典时,请使用 mutableDict = dictionary.mutableCopy() ,然后保存回nsdictionary:dictionary = mutableDict.copy()
  • 针对NSTextField的具体情况绑定(bind),绑定(bind)将用于显示值,但要更新值,您必须在没有绑定(bind)的情况下执行此操作(每当您的 View 消失或文本字段结束编辑时)

希望有帮助!

关于swift - Cocoa 绑定(bind)仅以一种方式工作(NSMutableDictionary),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58954332/

相关文章:

ruby-on-rails - 在 Macbook Air OS 10.9 上安装 Rails 时出错

iphone - NSMutableDictionary 的 JSONRepresentation

objective-c - objectForKey 不返回任何内容

iphone - 我们如何存储到 NSDictionary 中? NSDictionary 和 NSMutableDictionary 有什么区别?

swift - UiTableview 在 iOS 10 中不更新 sizetofit 但在 iOS 11 中工作

inheritance - 协议(protocol)类型对象的 Swift 数组

ios - 对计算属性的 Realm 结果集合进行排序?

macos - CodeBlocks 在 Mac 上崩溃

ios - 在保存到 Realm 数据库之前发生打印时,LinkObjects 属性被清空

swift - 如何在 Swift 4 中以编程方式显示 macOS 应用程序的窗口/ View Controller