Είμαι με τη χρήση +[NSUserDefaults standardUserDefaults]για να αποθηκεύσετε τις ρυθμίσεις της εφαρμογής. Αυτή αποτελείται από τιμές συμβολοσειράς περίπου μια δωδεκάδα. Είναι δυνατόν να διαγράψετε αυτές τις αξίες μόνιμα και όχι μόνο αποβίβασή τους σε μια προκαθορισμένη τιμή;
NSUserDefaults εκκαθάριση
Μπορείτε να αφαιρέσετε επίμονες τομέα της εφαρμογής, όπως αυτό:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Σε Swift 3 και αργότερα:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Αυτό είναι παρόμοιο με την απάντηση @samvermette, αλλά είναι λίγο πιο καθαρό κομμάτι του ΙΜΟ.
Αυτός ο κωδικός επαναφέρει τις προεπιλεγμένες ρυθμίσεις στο πεδίο καταχώρησης:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Με άλλα λόγια, removeObjectForKeyγια κάθε βασικό έχετε εγγραφεί ποτέ σε αυτό το app.
Συντελεστές για να Ken Thomases αυτή της Apple Developer Φόρουμ νήμα.
Μήπως δοκιμάστε να χρησιμοποιήσετε - removeObjectForKey;
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Εδώ είναι η απάντηση στο Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Αν το χρειάζεστε παράλληλα με την ανάπτυξη, μπορείτε επίσης να επαναφέρετε εξομοιωτή σας, διαγράφοντας όλα τα NSUserDefaults.
iOS Simulator -> Επαναφορά περιεχομένου και των ρυθμίσεων ...
Λάβετε υπόψη ότι θα διαγραφούν επίσης όλες τις εφαρμογές και τα αρχεία σε προσομοιωτή.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Σε Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Λατρεύω τις επεκτάσεις όταν κάνουν τον κωδικό σκούπα:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Σημείωση: Αυτή η απάντηση έχει ενημερωθεί για Swift πάρα πολύ.
Τι πρόκειται να το έχετε σε μία γραμμή;
Η επέκταση @Christopher Rogers απάντηση - η αποδεκτή μία.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
και ναι, κάποια στιγμή μπορεί να χρειαστεί να synchronizeτο,
[[NSUserDefaults standardUserDefaults] synchronize];
Έχω δημιουργήσει μια μέθοδο για να γίνει αυτό,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ;
Με την ταχεία του ακόμα πιο εύκολη.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
Και τη χρήση :
UserDefaults.clean()
Βρηκα αυτο:
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
Είναι ένα bug ή οτιδήποτε, αλλά η removePersistentDomainForNameδεν λειτουργεί ενώ αποφεύγει όλες τις NSUserDefaultsτιμές.
Έτσι, η καλύτερη επιλογή είναι ότι για να επαναφέρετε το PersistentDomainκαι αυτό μπορείτε να το κάνετε μέσω ακόλουθο τρόπο:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Όλες οι παραπάνω απαντήσεις είναι πολύ σημαντικό, αλλά αν κάποιος εξακολουθεί να αδυνατεί να επαναφέρετε τις userdefaults για διαγραφή της εφαρμογής, στη συνέχεια, μπορείτε να επαναφέρετε τις ρυθμίσεις του περιεχομένου σας προσομοιωτή, και αυτό θα λειτουργήσει.
Επέκταση σε απάντηση @ 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 είναι: η μέθοδος. Καθώς η κατάσταση docs, η μέθοδος «Επιστρέφει ένα λεξικό που περιέχει τα πλήκτρα και τις αξίες στον καθορισμένο επίμονη τομέα.» Κλήση dictionaryRepresentation: αντ 'αυτού, θα επιστρέψει ένα λεξικό που θα περιλαμβάνει πιθανόν άλλες ρυθμίσεις, όπως εφαρμόζεται σε ένα ευρύτερο πεδίο.
Αν χρειαστεί να φιλτράρετε οποιαδήποτε από τις τιμές που πρόκειται να επαναφέρετε, στη συνέχεια, την επανάληψη των κλειδιών είναι ο τρόπος για να το κάνει. Προφανώς, αν θέλετε να nuke ακριβώς όλα τα προτιμήσεων για το app χωρίς να λαμβάνεται υπόψη, τότε μια από τις άλλες μεθόδους που δημοσιεύτηκε παραπάνω είναι η πιο αποτελεσματική.
Δοκιμάστε αυτό, αυτό λειτουργεί για μένα.
Ενιαία γραμμή κώδικα
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
αν η ρύθμιση αίτηση χρειάζεται επαναφορά nsuserdefault για την πρόσβαση στο μικρόφωνο (δική μου περίπτωση), μια απλή λύση είναι η απάντηση από τον Anthony McCormick ( iPhone - Πώς να ενεργοποιήσετε την πρόσβαση εφαρμογή στα μέσα ενημέρωσης στη συσκευή - ALAssetsLibraryErrorDomain Κωδικός = -3.312 «Παγκόσμια επιτρέπεται η πρόσβαση» ).
στη συσκευή, μεταβείτε στις Ρυθμίσεις> Γενικά> Επαναφορά> Επαναφορά Προειδοποιήσεις Τοποθεσία













