【发布时间】:2018-10-12 23:01:41
【问题描述】:
我在 UserDefaults 和 TextField 之间通过 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Ô\u{01}\u{02}\u{03}\u{04}\u{05}\u{06}\t\nX$versionX$objectsY$archiverT$top\u{12}\0\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\0\0\0\0\0\0\u{01}\u{01}\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 个小时。很高兴我终于决定问了。下拉菜单只有两个选项,我想我必须选择一个或另一个。我没有意识到它可能是空的......
标签: cocoa nsuserdefaults cocoa-bindings userdefaults nsarchiving