在Swift 3

时间:2018-03-29 05:20:37

标签: ios swift userdefaults

我使用UserDefaults在我的iOS应用中跟踪用户的偏好设置 - 当用户选择表格单元格时,它会将单元格的文本添加到我的密钥中。那部分有效。

现在,我希望允许用户在选择行时从键中删除匹配的键值。如果某个单元格显示“第1集”,则应从UserDefaults中删除该值。

the documentation开始,removeObject有一个实例方法。这是我写的:

    let defaults = UserDefaults.standard
    var myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
    if let datastring = TableData[indexPath.row] as? String {
        if !myarray.contains(datastring) {
            myarray.append(datastring)
            defaults.removeObject(myarray, forKey: "SavedStringArray")
            defaults.synchronize()
        }

这会返回Extra argument in call的错误 - 我认为它意味着myarray,但如果我不能添加该参数,我怎么能告诉它只删除一个值(存储在{{} 1}})?

如果我打印myarray,它将返回存储的剧集值列表,如`[“First Episode”,“Second Episode”,“Third Episode”]

知道如何在此处单击该单元格时删除UserDefaults.standard吗?

3 个答案:

答案 0 :(得分:4)

我有以下适合您的代码。

if myarray.contains(datastring) {
    myarray.remove(at: myarray.index(of: datastring)!)
} else {
    myarray.append(datastring)
}
defaults.set(myarray, forKey: "SavedStringArray")

此代码将从数组中删除元素并在相同键的用户默认值中再次设置数组,因此它将用新数组替换您的数组。

答案 1 :(得分:1)

如果字符串不存在,您可以添加或删除字符串(如果存在)。然后更新阵列。 然后为该键设置该数组。

if !myarray.contains(datastring) {
    myarray.append(datastring)
} else {
    myarray = myarray.filter{$0 != datastring}
}
defaults.set(myarray, forKey: "SavedStringArray")

答案 2 :(得分:0)

您可以为String类型的数组尝试此逻辑,即[String]

    var arrStr:[String] = ["Cat","Rat","Mouse"]
    print(arrStr)

    let datastring = "Rat"
    if !arrStr.contains(datastring) {
        arrStr.append(datastring)
    } else {
        arrStr.remove(at: arrStr.index(of: datastring)!)
    }

    print(arrStr)
    UserDefaults.standard.set(arrStr, forKey: "SavedStringArray")
    UserDefaults.standard.synchronize()