尝试在用户默认值中设置数组时出错:线程 1:"尝试插入非属性列表对象



我已经解决了这个问题,谢谢你的帮助。我不应该尝试用UITextViews保存数组,但我应该将它们的文本保存为字符串。原来的问题是:

我试了很多,谷歌了很多,但我不能自己解决这个问题。每当我尝试在userdefaults中保存数组时,它就是不工作。我得到以下错误:

线程1:尝试插入非属性列表对象(n "layer =;contenttoffset: {0,0};contentSize: {355,30};

调整内容:{0,0,0,0}>

"n)为关键内容"我不知道非属性列表对象是什么。我不知道如何解决这个问题。下面是不能工作的代码行:

var contentList: [Any] = []
let cl = defaults.array(forKey: "content")!
if cl.count != 0{
contentList += cl
}
contentList.append(label)
defaults.setValue(contentList, forKey: "content")

如果我把最后一行代码变成注释,一切都可以正常运行。我应该如何替换那行代码?我本质上想保存一个UITextViews数组,并在每次调用函数时使其变大(此代码是更大函数的一部分)。我创建另外两个列表(cl和contentList)的原因是它可以帮助我解决问题。然而,我不能理解的是,为什么最后一行代码不起作用。如果有人有任何想法,请帮助我,我将不胜感激。

只使用注释中说明的字符串:

var contentList: [String] = []
let cl = defaults.array(forKey: "content")!
if cl.count != 0{
contentList += cl
}
If lbText = label.text {
contentList.append(lbText)
defaults.setValue(contentList, forKey: "content")
}

您只能在UserDefaults中存储非常有限的数据类型列表,通常称为"属性列表对象"。(因为属性列表(或plist)文件将只存储相同的数据类型。

在"存储默认对象"一节中引用Xcode文档中的UserDefaults:

默认对象必须是一个属性列表,即Swift中NSData,NSString,NSNumber,NSDate,NSArrayNSDictionary[或Data,String,NSNumber,Date,ArrayDictionary类型的实例(或集合,实例的组合)。如果你想存储任何其他类型的对象,你应该归档它来创建一个Data实例。

(我在方括号中添加了Swift的等效类型,因为看起来苹果还没有为Swift更新。)

你的措辞有点笨拙。其思想是,您只能存储列出的类型的数据。因为ArrayDictionary类型是"container"类型,您可以存储包含上述任何类型组合的数组和字典的任何组合。例如,您可以存储一个包含字典、3个日期、2个浮点数、一个Double、一些数据和2个数组的数组,这些字典和数组可以包含其他字典和/或数组。

它几乎总是错误的归档UIView对象像UITextViews。你应该保存你的文本视图的text属性。

如果你想管理UITextView对象的垂直堆栈,我建议在你的用户界面添加一个垂直堆栈视图,然后编写代码添加或删除UITextView子视图到你的堆栈视图。您应该能够在线找到大量从堆栈视图中添加和删除对象的示例。(这真的很简单。)

如果想管理任意长度的提要滚动列表,可能需要使用表视图或集合视图。这需要您设置一个数据模型并实现一个"数据源"。这需要一点练习才能正确,但非常强大。