在Swift中删除NSUserDefaults的键值

时间:2015-12-17 09:38:25

标签: ios swift nsuserdefaults

如何从NSUserDefaults删除数据?如何在Objective C中做到这一点有很多答案,但Swift怎么样? 所以我尝试了这个:

let defaults = NSUserDefaults.standardUserDefaults()
    defaults.removeObjectForKey("myKey")

没用。也许我真正想要删除的不是NSUserDefaults? 这是我保存数据的方式:

class MySavedData: NSObject, NSCoding {
    var image: String

    init(name: String, image: String) {
        self.image = image
    }

    required init(coder aDecoder: NSCoder) {
        image = aDecoder.decodeObjectForKey("image") as! String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(image, forKey: "image")
    }
}

class ViewController: <...> {
    var myData = [MySavedData]() //Later myData gets modified and then function save() is called

    func save() {
        let savedData = NSKeyedArchiver.archivedDataWithRootObject(myData)
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(savedData, forKey: "myKey")
    }
}

编辑:只是为了清除一些东西 - 保存的数据很小(甚至不接近100kb)

也许我正在保存数据而不是NSUserDefaults(我是编程新手),所以这就是我如何得到它(加载):

let defaults = NSUserDefaults.standardUserDefaults()
if let savedData = defaults.objectForKey("myData") as? NSData {
    myData = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as! [UserLogin]
    }

10 个答案:

答案 0 :(得分:66)

removeObjectForKey是正确的方法。
这将删除所选键的值。以下代码为NSUserDefaults中的键设置字符串值,打印它然后使用removeObjectForKey再次删除和打印键值。在removeObjectForKey之后,值为nil。

let prefs = NSUserDefaults.standardUserDefaults()
var keyValue = prefs.stringForKey("TESTKEY")
print("Key Value not set \(keyValue)")
let strHello = "HELLO WORLD"

prefs.setObject(strHello, forKey: "TESTKEY")
keyValue = prefs.stringForKey("TESTKEY")
print("Key Value \(keyValue)")

prefs.removeObjectForKey("TESTKEY")
keyValue = prefs.stringForKey("TESTKEY")
print("Key Value after remove \(keyValue)")

返回:

键值未设置为

键值可选(“你好世界”)

删除nil后的键值

更新Swift 3:

let prefs = UserDefaults.standard
keyValue = prefs.string(forKey:"TESTKEY")
prefs.removeObject(forKey:"TESTKEY")

答案 1 :(得分:12)

您编写的代码可以正常工作,但NSUserDefaults会在特定时间间隔内同步。

如您所愿,应立即反映在NSUserDefaults中,因此您需要编写同步

let defaults = NSUserDefaults.standardUserDefaults()
defaults.removeObjectForKey("myKey") 
defaults.synchronize()

答案 2 :(得分:7)

试试这个

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

for Swift 3

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

但是这将在使用时清除NSUserDefaults.careful中的所有值。

答案 3 :(得分:4)

我会寻找一个解决方案,将设置为nil以获取

Swift 3

UserDefaults.standard.set(nil, forKey: "key")

Swift 2.x

NSUserDefaults.standardUserDefaults().setValue(nil, forKey: "key")

注意:这是一个明确而直接的陈述,但请记住,在NSUserDefaults中存储信息是有限制的,它绝对是正确的存储位置大型二进制文件(例如图像) - 为此有一个Documents文件夹。但是没有定义你编码/解码的var image: String有多大。

答案 4 :(得分:2)

使用以下for循环:

for key in NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys {
   NSUserDefaults.standardUserDefaults().removeObjectForKey(key.description)
}

答案 5 :(得分:2)

Swift 4.x删除UserDefaults中的所有密钥

let defaults = UserDefaults.standard
let dictionary = defaults.dictionaryRepresentation()

    dictionary.keys.forEach 
    { key in   defaults.removeObject(forKey: key)
    }

答案 6 :(得分:1)

根据最佳答案删除swift 3中key的UserDefaults,语法略有不同:

UserDefaults.standard.removeObject(forKey: "doesContractExist")

答案 7 :(得分:0)

更新Swift的代码: 在下面的代码行中用于删除Swift中NSUserDefaults的键值

-setImageWithURLRequest:...

答案 8 :(得分:0)

要核对所有UserDefaults个键,您可以在Swift 3.x中使用以下代码:

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

答案 9 :(得分:0)

func  remove_pref(remove_key : String){
    UserDefaults.standard.removeObject(forKey: remove_key)
    UserDefaults.standard.synchronize()
}