Cocoa 绑定,绑定到文本字段的默认值中的字符串值。如何以编程方式读取此字符串?

Posted

技术标签:

【中文标题】Cocoa 绑定,绑定到文本字段的默认值中的字符串值。如何以编程方式读取此字符串?【英文标题】:Cocoa Bindings, String value in Defaults bound to a Text Field. How can I programmatically read this string? 【发布时间】:2018-10-12 23:01:41 【问题描述】:

我在 UserDefaultsTextField 之间通过 IB 设置了可可绑定:

这很好用,每次启动应用程序时,TextField 都会保持其价值

但是,我还想在代码的其他位置以编程方式读取此字符串值。我基本上已经尝试了所有UserDefaults.standard 电话:

guard let supplierData = UserDefaults.standard.data(forKey: "singleSupplierDownloadName") else return

returns: ▿ 145 bytes
  - count : 145   ▿ pointer : 0x0000608000187ae0
    - pointerValue : 106102873684704

UserDefaults.standard.string(forKey:) 返回nil

object(forKey:) 返回:

▿ Optional<Any>
  - some : <62706c69 73743030 d4010203 04050609 0a582476 65727369 6f6e5824 6f626a65 63747359 24617263 68697665 72542474 6f701200 0186a0a2 07085524 6e756c6c 57746573 74696e67 5f100f4e 534b6579 65644172 63686976 6572d10b 0c54726f 6f748001 08111a23 2d32373a 40485a5d 62000000 00000001 01000000 00000000 0d000000 00000000 00000000 00000000 64>

鉴于此,我决定尝试对使用data(forKey:) 检索到的Data 做一些事情

(lldb) po String(data: supplierData, encoding: .ascii)
▿ Optional<String>
  - some : "bplist00Ô\u01\u02\u03\u04\u05\u06\t\nX$versionX$objectsY$archiverT$top\u12\0\u01 ¢\u07\u08U$nullWtesting_\u10\u0FNSKeyedArchiverÑ\u0B\u0CTroot\u01\u08\u11\u1A#-27:@HZ]b\0\0\0\0\0\0\u01\u01\0\0\0\0\0\0\0\r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d"

我玩过不同的编码器,但都是垃圾。在我使用ascii之前,你可以看到里面有英文的提示,“NSKeyedArchiver”,“unarchiver”等。让我相信这个数据实际上不仅仅是一个String,而是一个压缩的String(存档)

所以我想也许我需要初始化一个NSKeyedUnarchiver

(lldb) po NSKeyedUnarchiver(forReadingWith: supplierData)
<NSKeyedUnarchiver: 0x60800010beb0>

但是从那里...我不知道该怎么办。我从NSKeyedUnarchiver 询问的所有内容都返回nil

我走对了吗?

如何通过 Cocoa Bindings 读取存储在 Shared User Defaults Controller 中的字符串值?

【问题讨论】:

你为什么用NSKeyedUnarchiveFromData 为什么在绑定中使用NSKeyedUnarchiveFromData 作为值转换器?如果您仍在开发中,只需将其删除(将该字段留空)。 omg...浪费了 3 个小时。很高兴我终于决定问了。下拉菜单只有两个选项,我想我必须选择一个或另一个。我没有意识到它可能是空的...... 【参考方案1】:

解决方法是不使用 NSKeyedUnarchiveFromData 作为绑定上的值转换器(或任何值转换器,根本)。

当您使用值转换器时,这会使绑定系统将视图中的值转换为模型要存储的其他值,并且当它从模型中检索值时,将其转换为视图所需的值可以一起工作。在您的情况下,文本字段自然地与字符串值一起使用,用户默认系统也是如此,因此没有必要或受益于数据对象的转换。

通过NSKeyedUnarchiveFromData 进行转换的主要用途是用于无法直接存储在属性列表中的类型的值,例如颜色对象。

【讨论】:

以上是关于Cocoa 绑定,绑定到文本字段的默认值中的字符串值。如何以编程方式读取此字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa NSTextField - 绑定和设置属性

带有核心数据的 Cocoa 绑定不更新所有列

将文本字段绑定到数组中的对象时出错

如何将光标设置到 Internet Explorer 中文本 INPUT 字段的字符串值中的特定位置?

如何将字体大小绑定到可变网格大小

使用 Blazor 将输入文本动态绑定到类/对象属性