Jak zapisać NSMutablearray w NSUserDefaults

Mam dwa NSMutableArray ' s. składają się z obrazów lub tekstu. Tablice są wyświetlane za pomocą UITableView. Po zabiciu aplikacji dane z {[1] } zostają utracone. Jak zapisać tablicę w UITableView używając NSUserDefault?

Author: Suragch, 2013-10-28

9 answers

Uwaga: NSUserDefaults zawsze zwróci niezmienną wersję obiektu, który przekazujesz.

Aby zapisać informacje:

// Get the standardUserDefaults object, store your UITableView data array against a key, synchronize the defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:arrayOfImage forKey:@"tableViewDataImage"];
[userDefaults setObject:arrayOfText forKey:@"tableViewDataText"];
[userDefaults synchronize];

Aby pobrać informacje:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayOfImages = [userDefaults objectForKey:@"tableViewDataImage"];
NSArray *arrayOfText = [userDefaults objectForKey:@"tableViewDataText"];
// Use 'yourArray' to repopulate your UITableView

Przy pierwszym załadowaniu sprawdź, czy wynik, który pochodzi z NSUserDefaults jest nil, Jeśli tak, musisz utworzyć swoje dane, w przeciwnym razie załaduj dane z NSUserDefaults i twoje UITableView zachowa stan.

Update

W języku Swift-3 można zastosować następujące podejście użyte:

let userDefaults = UserDefaults.standard

userDefaults.set(arrayOfImage, forKey:"tableViewDataImage")
userDefaults.set(arrayOfText, forKey:"tableViewDataText")
userDefaults.synchronize()

var arrayOfImages = userDefaults.object(forKey: "tableViewDataImage")
var arrayOfText = userDefaults.object(forKey: "tableViewDataText")
 109
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 11:24:33

Możesz zapisać zmienną tablicę w następujący sposób:

[[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"YourKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

Później odzyskujesz zmienną tablicę z domyślnych wartości użytkownika. Ważne jest, aby otrzymać zmienną kopię, jeśli chcesz później edytować tablicę.

NSMutableArray *yourArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"YourKey"] mutableCopy];

Następnie po prostu ustawiasz UITableview dane z zmiennej tablicy za pomocą delegataUITableView

Mam nadzieję, że to pomoże!
 42
Author: Philipp Otto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 19:29:31

Chcę tylko dodać do innych odpowiedzi, że obiekt, który zamierzasz przechowywać, przechowuje się w NSUserDefault, jak opisano w dokumentacji Apple, musi być zgodny z tym:

" parametrem value mogą być tylko obiekty listy właściwości: NSData, NSString, NSNumber, NSDate, NSArray lub NSDictionary. Dla obiektów NSArray i NSDictionary ich zawartość musi być obiektami property list."

Tutaj link do property list programming guide

Więc zwróć uwagę na to, co jest inside your array

 7
Author: Manu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 05:53:40

Zapisz:

NSUserDefaults.standardUserDefaults().setObject(PickedArray, forKey: "myArray")
 NSUserDefaults.standardUserDefaults().synchronize()

Pobierz:

if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") {
    print("SUCCCESS:")
    println(PickedArray)
}
 3
Author: A.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 05:39:36

Czy naprawdę chcesz przechowywać obrazy w liście właściwości? Możesz zapisywać obrazy do plików i przechowywać nazwę pliku jako wartość w NSDictionary.

Zdefiniuj ścieżkę dla plików przechowujących


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
self.basePath = [paths firstObject];

Zapisz i Wczytaj obraz:


- (NSString *)imageWithKey:(NSString)key {
    NSString *fileName = [NSString stringWithFormat:@"%@.png", key]
    return [self.basePath stringByAppendingPathComponent:fileName];
}

- (void)saveImage:(UIImage *)image withKey:(NSString)key {
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:[self imageWithKey:key] atomically:YES];
}

- (UIImage *)loadImageWithKey:(NSString)key { {
    return [UIImage imageWithContentsOfFile:[self imageWithKey:key]];
}

I możesz zapisać ścieżkę lub indeksy w NSMutableDictionary


- (void)saveDictionary:(NSDictionary *)dictionary {
    NSMutableDictionary *dictForSave = [@{ } mutableCopy];
    for (NSString *key in [dictionary allKeys]) {
        [self saveImageWithKey:key];
        dictForSave[key] = @{ @"image" : key };
    }
    [[NSUserDefaults standardUserDefaults] setObject:dictForSave forKey:@"MyDict"];
}

- (NSMutableDictionary *)loadDictionary:(NSDictionary *)dictionary {
    NSDictionary *loadedDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyDict"];
    NSMutableDictionary *result = [@{ } mutableCopy];
    for (NSString *key in [loadedDict allKeys]) {
        result[key] = [self imageWithKey:key];
    }
    return result;
}

W NSUserDefaults można przechowywać tylko proste obiekty takie jak NSString, NSDictionary, NSNumber, NSArray.

Można również serializować obiekty za pomocą {[10] } zgodnego z protokołem NSCoding .

 2
Author: aironik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 05:48:26

Jeśli chcesz dodać stringi do NSMutableArray w określonej kolejności, lub jeśli używasz NSMutableArray dla UITableView możesz użyć tego zamiast:

[NSMutableArray insertObject:string atIndex:0];
 2
Author: Lance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 05:54:26

W Swift 3, dla nsmutablearray, będziesz musiał zakodować / dekodować swoją tablicę, aby móc ją zapisać / pobrać w NSUserDefaults:

Oszczędzanie

//Encoding array
let encodedArray : NSData = NSKeyedArchiver.archivedData(withRootObject: myMutableArray) as NSData

//Saving
let defaults = UserDefaults.standard
defaults.setValue(encodedArray, forKey:"myKey")
defaults.synchronize()

Odzyskiwanie

//Getting user defaults
let defaults = UserDefaults.standard

//Checking if the data exists
if defaults.data(forKey: "myKey") != nil {
   //Getting Encoded Array
   let encodedArray = defaults.data(forKey: "myKey")

   //Decoding the Array
   let decodedArray = NSKeyedUnarchiver.unarchiveObject(with: encodedArray!) as! [String]
}

Usuwanie

//Getting user defaults
let defaults = UserDefaults.standard

//Checking if the data exists
if defaults.data(forKey: "myKey") != nil {

    //Removing the Data
    defaults.removeObject(forKey: "myKey")

}
 2
Author: Ugo Marinelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-23 09:29:49

Wersja Swift:

Zapisz tablicę w NSUserDefaults:

NSUserDefaults.standardUserDefaults().setObject(selection, forKey: "genderFiltersSelection")

Pobierz Tablicę Bool Z NSUserDefaults:

if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
                selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [Bool] ?? [Bool]()
   }

Pobieranie Tablicy Łańcuchów Z NSUserDefaults:

if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
                selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [String] ?? [String]()
    }
 1
Author: Mughees,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 10:55:10

Zapisz informacje o tablicy w NSUserdefaults za pomocą klucza.

"MutableArray otrzymany z odpowiedzi JSON"

[[NSUserDefaults standardUserDefaults] setObject:statuses forKey:@"arrayListing"];

"pobranie tej informacji (tablicy) w dowolnym miejscu w projekcie za pomocą tego samego klucza"

NSArray *arrayList = [[NSUserDefaults standardUserDefaults] valueForKey:@"arrayListing"];
To pomogło mi w moim projekcie i mam nadzieję, że komuś pomoże.
 1
Author: Dilip Tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-06 13:12:41