Yo uso el NSUserDefaults diccionario para almacenar la información básica, tales como puntajes altos, etc, de modo que cuando el usuario cierra la aplicación no se pierdan datos. De todos modos yo uso:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

para almacenar datos. Si quiero almacenar un nuevo récord de puntuación, por ejemplo, me gustaría hacer:

[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize];  //this is needed in case the app is closed. 

y después si quiero recuperar la puntuación más alta que yo haría:

[prefs integerForKey:@"highScore"];

de todos modos, el punto es que me tienda un montón de otras cosas porque el NSUserDefaults enable almacenar booleans, integers, objects etc. ¿cuál sería el método que tengo que ejecutar para borrar todas las llaves para que NSUserDefaults llega a ser como la primera vez que me lanzamiento de la app?

Estoy buscando algo como:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];

o tal vez hay una manera de conseguir todas las llaves y tengo un bucle a través de cada objeto, pero no sé cómo eliminarlos.

EDICIÓN:

He intentado :

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];

y yo todavía soy capaz de recuperar una puntuación alta….

InformationsquelleAutor Tono Nam | 2011-07-22

15 Comentarios

  1. 146

    Si usted tiene un vistazo a la NSUserDefaults documentación verá un método - (NSDictionary *) dictionaryRepresentation. El uso de este método en el estándar predeterminados del usuario, usted puede obtener una lista de todas las claves de los valores predeterminados del usuario. Usted puede utilizar esto para borrar los valores predeterminados del usuario:

    - (void)resetDefaults {
        NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
        NSDictionary * dict = [defs dictionaryRepresentation];
        for (id key in dict) {
            [defs removeObjectForKey:key];
        }
        [defs synchronize];
    }
    • Camino más corto para hacer esto con los mismos resultados:______________________________________________ NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; __________________ [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
    • Esta no es la mejor manera de hacerlo, ya que va a recorrer y el intento de eliminar todo valores predeterminados del usuario teclas incluyendo el sistema, en lugar de sólo la aplicación de aquellos. El uso de -removePersistentDomainForName: como se sugiere en la otra respuesta es mucho mejor.
    • ¿No tendría más sentido utilizar [dict removeAllObjects] en lugar de recorrer todo el diccionario?
    • que no, que sólo elimina los objetos del diccionario, no de NSUserDefaults
  2. 70

    Camino más corto para hacer esto con los mismos resultados como en Alex Nichol respuesta:

    NSString *appDomain = NSBundle.mainBundle.bundleIdentifier;
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
    [[NSUserDefaults standardUserDefaults] synchronize];
    • Cómo borrar NSUserDefaults alloc]initWithSuiteName.
    • No olvides synchronize su NSUserDefaults justo después de si usted está usando los valores predeterminados de una manera que será necesario que.
  3. 44

    One-liner:

    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
    • No olvides synchronize su NSUserDefaults justo después de si usted está usando los valores predeterminados de una manera que será necesario que.
    • Como de iOS 11, sincronizar está en desuso.
  4. 24

    Solución Simple

    Objetivo C:

    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

    En Swift 3.0 :

    if let appDomain = Bundle.main.bundleIdentifier {
        UserDefaults.standard.removePersistentDomain(forName: appDomain)
    }
  5. 16

    Swift versión:

    if let bid = NSBundle.mainBundle().bundleIdentifier {
        NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
    }   
    • opcional no envueltos, no se adhiere a Swift mejores prácticas
    • Sí, aunque el identificador del paquete no es probable que sea nulo si usted está usando principal paquete, se recomienda el uso de Juan de código.
  6. 16

    + (void) resetStandardUserDefaults no persistir los cambios, simplemente restablece la memoria de usuario predeterminados del objeto, por lo que la próxima synchronize llamada se leen desde el disco de copia, en lugar de sobrescribir el existente en los valores de memoria con el disco de versiones.

    Iterar sobre las claves es mejor, pero en realidad hay una función que hace esto para usted: removePersistentDomainForName:.

    //you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier]
    [[NSUserDefaults standardUserDefaults]
     removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    //or use a string for any other settings domains you use
    //[[NSUserDefaults standardUserDefaults]
    //removePersistentDomainForName:@"com.mycompany.myappname"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    Al final de la synchronize operación, tanto el disco y la memoria de las copias de los predeterminados del usuario contendrá ninguno de los valores establecidos por la aplicación.

  7. 9

    Para aquellos de ustedes que quieren hacer esto en el examen objetivo, el uso de este (como el removePersistentDomain no funciona para ese caso)

    Swift 3:

    for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
         UserDefaults.standard.removeObject(forKey: key)
    }
    • La mejor solución cuando no queremos depender principal del paquete. En mi caso, me sentí la carga de un determinado paquete, y yo no estaba seguro de si las llaves estaban realmente eliminado.
  8. 9

    Oneliner en Swift:

    Swift 3

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

    Swift 4

    UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
    • Swift 4.0 —– UserDefaults.estándar.removePersistentDomain(forName: Bundle.principal.bundleIdentifier!) UserDefaults.estándar.synchronize()
    • Usted no necesita .synchronize(). Nunca hacer en tales situaciones normales. Los contenidos se guardan automáticamente.
    • Aunque si la aplicación se cerró antes de que tuviera tiempo para guardar automáticamente, entonces usted necesita para forzar a guardar.
    • También, synchronize no es sólo «guardar». synchronize ahorra y carga el conjunto de valores predeterminados del objeto (que puede ser más grande de lo esperado). No es necesario llamar a synchronize con el fin de «salvar» a los valores predeterminados. Si usted lo llama, usted debe tener una buena razón, y esos son raras. 😉
  9. 5

    Para Swift 3:

    let appDomain = Bundle.main.bundleIdentifier!
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
  10. 5

    Para Swift 3:

    if let bundle = Bundle.main.bundleIdentifier {
        UserDefaults.standard.removePersistentDomain(forName: bundle)
    }
  11. 2

    Swift

     func resetUserDefaults(){
    
        let userDefaults = NSUserDefaults.standardUserDefaults()
        let dict = userDefaults.dictionaryRepresentation() as NSDictionary
    
        for key in dict.allKeys {
    
                userDefaults.removeObjectForKey(key as! String)
        }
    
        userDefaults.synchronize()
    
    }
  12. 2

    Swift

    lugar en su lógica

    if let appDomain = Bundle.main.bundleIdentifier {
        UserDefaults.standard.removePersistentDomain(forName: appDomain)
    }
  13. 1

    Hace este método no hacerlo:

    + (void)resetStandardUserDefaults

    De la documentación para NSUserDefaults:

    resetStandardUserDefaults

    Sincroniza los cambios realizados para el usuario compartido valores predeterminados del objeto y
    libera de la memoria.

    + (void)resetStandardUserDefaults

    Discusión

    Una posterior invocación de standardUserDefaults crea una nueva compartido
    valores predeterminados del usuario objeto con el estándar de lista de búsqueda.

    Según esto, usted puede hacer:

    [NSUserDefaults resetStandardUserDefaults];
    [NSUserDefaults standardUserDefaults];

    y ahora los valores predeterminados se debe restablecer.

    • cuando me llaman [NSUserDefaults resetStandardUserDefaults]; no se borra nada.
    • Es mi entendimiento de que esta se refiere a la standardUserDefaults objeto compartido en lugar de la información almacenada en el disco, lo que significa que esto no tendrá un efecto notable en la guarda valores predeterminados del usuario.
    • parecía que la respuesta correcta…
    • cuando llame [NSUserDefaults resetStandardUserDefaults]; y luego hacer NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];, a mi entender (que puede ser incorrecta) es que prefs será una pizarra en blanco una vez más.
    • PengOne que usted está diciendo a escribir… (mira en mi edición)
    • Que es lo que mi ejemplo ya lo hace…
    • No; usted tiene el orden equivocado. En busca de mi edición.
    • Sí, es la misma idea. Yo no había leído tu respuesta pero ya me he ocupado de la discusión sobre la mía. Voy a quitar la edición y remitir a usted para ese enfoque.

  14. 1

    Swift 3 o 4
    Incluso podemos simplificar describe fragmento en esta expresión moderna:

    func clearAll() {
        let settingsDictionary = userDefaults.dictionaryRepresentation()
        settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
        userDefaults.synchronize()
    }
  15. 0

    Para eliminar todos los UserDefault valor en swift (Última sintaxis)

    //remove UserDefaults
      if let identifier = Bundle.main.bundleIdentifier {
          UserDefaults.standard.removePersistentDomain(forName: identifier)
          UserDefaults.standard.synchronize()
      }

Dejar respuesta

Please enter your comment!
Please enter your name here