ฉันใช้+[NSUserDefaults standardUserDefaults]
เพื่อจัดเก็บการตั้งค่าแอปพลิเคชัน สิ่งนี้ประกอบด้วยค่าสตริงประมาณโหล เป็นไปได้ไหมที่จะลบค่าเหล่านี้อย่างถาวรแทนที่จะตั้งเป็นค่าเริ่มต้น?
ฉันใช้+[NSUserDefaults standardUserDefaults]
เพื่อจัดเก็บการตั้งค่าแอปพลิเคชัน สิ่งนี้ประกอบด้วยค่าสตริงประมาณโหล เป็นไปได้ไหมที่จะลบค่าเหล่านี้อย่างถาวรแทนที่จะตั้งเป็นค่าเริ่มต้น?
คำตอบ:
คุณสามารถลบโดเมนถาวรของแอปพลิเคชันเช่นนี้:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
ใน Swift 3 และใหม่กว่า:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
นี่คล้ายกับคำตอบของ @samvermette แต่เป็น IMO ที่สะอาดขึ้นเล็กน้อย
รหัสนี้รีเซ็ตค่าเริ่มต้นเป็นโดเมนการลงทะเบียน:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
กล่าวอีกนัยหนึ่งก็คือ removeObjectForKey
สำหรับทุกคีย์เดียวที่คุณเคยลงทะเบียนในแอพนั้น
เพิ่มเครดิตให้กับ Ken Thomases ในกระทู้นักพัฒนา Apple นี้
[NSUserDefaults resetStandardUserDefaults]
ทำอย่างนี้ไม่ได้อยู่เหนือฉัน
คุณลองใช้ - removeObjectForKey
?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
นี่คือคำตอบใน Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
สายการบิน
if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
NSUserDefaults
หากคุณจำเป็นต้องใช้มันขณะที่การพัฒนานอกจากนี้คุณยังสามารถตั้งค่าจำลองของคุณลบทั้งหมด
iOS Simulator -> รีเซ็ตเนื้อหาและการตั้งค่า ...
โปรดจำไว้ว่ามันจะลบแอพและไฟล์ทั้งหมดในเครื่องจำลอง
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
ในสวิฟท์:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
หมายเหตุ: คำตอบนี้ได้รับการปรับปรุงสำหรับ Swift ด้วย
จะเกี่ยวกับอะไรในหนึ่งบรรทัด?
การขยายคำตอบ @Christopher Rogers - คำตอบที่ยอมรับได้
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
และใช่บางครั้งคุณอาจต้องการsynchronize
มัน
[[NSUserDefaults standardUserDefaults] synchronize];
ฉันได้สร้างวิธีการทำสิ่งนี้แล้ว
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
รวดเร็วหรือไม่
ด้วยความรวดเร็วมันง่ายยิ่งขึ้น
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
และการใช้งาน :
UserDefaults.clean()
ฉันชอบส่วนขยายเมื่อพวกเขาทำให้โค้ดสะอาดขึ้น:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
สวิฟท์ 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
ฉันพบสิ่งนี้:
osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"
ที่มา: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
คำตอบทั้งหมดข้างต้นมีความเกี่ยวข้องมาก แต่ถ้ามีคนยังไม่สามารถรีเซ็ต userdefaults สำหรับแอปที่ลบแล้วคุณสามารถรีเซ็ตการตั้งค่าเนื้อหาของคุณจำลองและมันจะทำงาน
มันเป็นข้อบกพร่องหรืออะไรก็ตาม แต่removePersistentDomainForName
มันไม่ทำงานในขณะที่ล้างNSUserDefaults
ค่าทั้งหมด
ดังนั้นตัวเลือกที่ดีกว่าคือการรีเซ็ตPersistentDomain
และคุณสามารถทำได้ผ่านวิธีต่อไปนี้:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
ขยายคำตอบของ @ folse ... ฉันเชื่อว่าการนำไปปฏิบัติที่ถูกต้องมากขึ้นจะเป็น ...
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
for (NSString *key in [defaultsDictionary allKeys]) {
NSLog(@"removing user pref for %@", key);
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
... เรียกใช้เมธอด persistentDomainForName: NSUserDefault ในขณะที่สถานะเอกสารวิธี "ส่งคืนพจนานุกรมที่มีคีย์และค่าในโดเมนถาวรที่ระบุ" การเรียกใช้พจนานุกรมการนำเสนอ: แต่จะส่งคืนพจนานุกรมที่น่าจะรวมถึงการตั้งค่าอื่น ๆ แทนซึ่งจะใช้กับขอบเขตที่กว้างขึ้น
หากคุณต้องการกรองค่าใด ๆ ที่จะถูกรีเซ็ตการทำซ้ำคีย์จะเป็นวิธีที่ทำได้ เห็นได้ชัดว่าถ้าคุณต้องการเพียงแค่ prefs ทั้งหมดสำหรับแอปโดยไม่คำนึงถึงวิธีการอื่นที่โพสต์ข้างต้นนั้นมีประสิทธิภาพมากที่สุด
หากการตั้งค่าแอปพลิเคชันที่ต้องการรีเซ็ตเป็น nsuserdefault สำหรับการเข้าถึงไมโครโฟน (กรณีของฉัน) คำตอบง่ายๆจาก Anthony McCormick ( iPhone - วิธีการเปิดใช้งานแอปพลิเคชันเข้าถึงสื่อบนอุปกรณ์ - ALAssetsLibraryErrorDomain Code = -3312 )
บนอุปกรณ์ให้ไปที่การตั้งค่า> ทั่วไป> รีเซ็ต> รีเซ็ตคำเตือนตำแหน่ง
ลองสิ่งนี้มันใช้งานได้สำหรับฉัน
รหัสบรรทัดเดียว
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];