0

我有一个可可绑定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我检索到的data(forKey:)

(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 读取存储在共享用户默认控制器中的这个字符串值?

4

1 回答 1

1

修复不是NSKeyedUnarchiveFromData用作绑定上的值转换器(或任何值转换器,根本)。

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

转换 via 的主要用途NSKeyedUnarchiveFromData是用于不能直接存储在属性列表中的类型的值,例如颜色对象。

于 2018-10-13T00:36:50.307 回答