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

Cocoa Bindings, String value in Defaults bound to a Text Field. How can I programmatically read this string?

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

效果很好,每次启动应用程序时,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:) returns nil

object(forKey:) returns 这个:

▿ 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Ô\u{01}\u{02}\u{03}\u{04}\u{05}\u{06}\t\nX$versionX$objectsY$archiverT$top\u{12}[=13=]\u{01} ¢\u{07}\u{08}U$nullWtesting_\u{10}\u{0F}NSKeyedArchiverÑ\u{0B}\u{0C}Troot\u{01}\u{08}\u{11}\u{1A}#-27:@HZ]b[=13=][=13=][=13=][=13=][=13=][=13=]\u{01}\u{01}[=13=][=13=][=13=][=13=][=13=][=13=][=13=]\r[=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=]d"

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

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

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

但是从那里...我不知道该怎么做。我从 NSKeyedUnarchiver returns nil

询问的一切

我走在正确的轨道上吗?

如何通过 Cocoa 绑定读取存储在共享用户默认值控制器中的字符串值?

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

当您使用值转换器时,这会使绑定系统将视图中的值转换为模型要存储的其他值,并且当它从模型中检索值时,将其转换为一个值该视图可以使用。在您的情况下,文本字段自然地使用字符串值,用户默认系统也是如此,因此转换 to/from 数据对象没有必要也没有好处。

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