1

У меня есть NSMutableArray, хранящийся в NSUserDefaults. Изменяемый массив правильно отредактирован и результаты редактирования можно просмотреть с помощью:NSUserDefaults NSMutable Array не сохраняет между сеансами

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

Однако, когда я ушел, и перезапустить приложение, по умолчанию пользователя возвращается к своей первоначальной форме.

Я пытаюсь сохранить состояние, выполнив этот метод принудительной синхронизации:

-(void) saveUserDefaults{ 
if([[NSUserDefaults standardUserDefaults] synchronize]){ 
    NSLog(@"Defaults saved"); 
}else{ 
    NSLog(@"Defaults save failed"); 
} 

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); 

}

Есть ли какие-либо идеи, почему это не может быть экономия?

Я установил массивы пользователя по умолчанию, используя этот код в первый раз, когда приложение запускается:

// Check if first time run 
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"isFirstRun"] isEqualToString:@"no"]) { 

    // Not first run, NSUserDefault arrays are already set 
}else { 
    // First Run of Program 
    // Mark for future 
    [[NSUserDefaults standardUserDefaults] setObject:@"no" forKey:@"isFirstRun"]; 


    designerArray = [[NSMutableArray alloc] initWithObjects: @"Alberta Ferretti", @"Alberto Fermani", @"Alejandro Ingelmo", @"Alexander McQueen", @"Alexander Wang", @"Ann Demeulemeester", @"Anne Klein", @"Aquatalia", @"Anya Hindmarch", @"Ash", @"Badgley Mischka Platinum Label", @"Balenciaga ", @"BCBGMAXAZRIA", @"BC Studio", @"Be & D", @"Belle by Sigerson Morrison", @"Bettye Muller ", @"Beverly Feldman", @"Botkier", @"Bourne", @"Bottega Veneta", @"Brian Atwood", @"Burberry", @"Burberry Prorsum", @"Camilla Skovgaard", @"Candela", @"Carlos Falchi", @"Casadei ", @"Chie Mihara", @"Chloe", @"Christian Louboutin", @"Claudio Merazzi", @"Coach", @"Cole Haan", @"Comme des Garcons", @"Costume National", @"Cynthis Vincent", @"Delman ", @"Devi Kroell", @"Derek Lam", @"Diane von Furstenberg", @"Dior", @"Dolce & Gabbana", @"Dolce Vita", @"Donald J Pliner ", @"Donna Karan", @"Elie Tahari ", @"Elizabeth and James", @"Emilio Pucci", @"Emma Hope", @"Eric Javits", @"Fendi", @"Ferragamo ", @"Foley & Corinna", @"Frye ", @"Furla", @"Giuseppe Zanotti", @"Givenchy", @"Gucci", @"Halston Heritage", @"H by Hudson", @"Hobo International", @"House of Harlow 1960", @"Hunter", @"Jack Rogers", @"Jean Paul ", @"Jerome C. Rousseau", @"Jil Sander", @"Jimmy Choo", @"Joan & David", @"Joie", @"Jonathan Kelsey", @"Judith Leiber", @"Juicy Couture", @"Junya Watanabe", @"Kate Spade", @"Kooba", @"Kork-Ease ", @"Kors Michael Kors", @"L.A.M.B.", @"LD Tuttle", @"Le Silla", @"Lanvin", @"Lilly Pulitzer", @"Linea Pelle", @"Lockheart", @"Loeffler Randall", @"Longchamp", @"Luciano Padovan", @"Maison Martin Margiela", @"Maison Martin Margiela MM6", @"MANITOBAH MUKLUKS ", @"MANOLO BLAHNIK ", @"Marc by Marc Jacobs", @"Marc Jacobs", @"Marina Rinaldi", @"MATT BERNSON ", @"Max Kibardin", @"MCM", @"Melissa", @"Michael Kors", @"MICHAEL MICHAEL KORS", @"Milly", @"Miu Miu", @"Miss Sixty", @"Missoni", @"Modern Vintage", @"Moschino", @"Moschino Cheap and Chic", @"Nancy Gonzalez", @"Narcisco Rodriguez", @"Nina Ricci", @"Nicholas Kirkwood", @"Olivia Harris", @"Opening Ceremony", @"Oscar de la Renta", @"PATRICIA GREEN ", @"Pedro Garcia ", @"Philosophy by Alberta Ferretti", @"Pollini", @"Prada", @"Proenza Schouler", @"Pura Lopez",@"Rachel Comey ", @"Rag & Bone", @"Ralph Lauren", @"Rebecca Minkoff", @"Rene Caovilla ", @"Repetto", @"Robert Clergerie ", @"Rock & Republic", @"Rosegold", @"Rupert Sanderson", @"Salvatore Ferragamo", @"SAM EDELMAN ", @"Scorah Pattulo", @"See by Chloe", @"7 for all mankind ", @"Sergio Rossi", @"Sigerson Morrison", @"Stella McCartney ", @"Stephane Verdino", @"Steve Madden", @"Storksak", @"Stuart Weitzman", @"Studio Pollini", @"Taryn Rose", @"Thakoon", @"Theory", @"Tracy Reese", @"Tod's", @"TOMS ", @"Tory Burch", @"UGG Australia", @"Valentino", @"Vera Wang Lavender Label", @"Versace", @"Via Spiga", @"Vince Camuto", @"Yves Saint Laurent", @"Zac Posen", @"Zagliani", @"-", nil]; 

    [[NSUserDefaults standardUserDefaults] setObject:designerArray forKey:@"designerArray"]; 

    shoeStyles = [[NSMutableArray alloc] initWithObjects: @"Ankle Strap", @"Ballet Flat", @"Boot", @"Bootie", @"Buckle Strap", @"Caged", @"Cowboy Boot", @"D'Orsay", @"Espadrille", @"Flat", @"Flat Sandal", @"Lace Up Boot",@"Mary Jane", @"Mid Calf Boot", @"Open Toe Flat", @"Open Toe Pump", @"Platform", @"Strappy Sandal", @"Thigh High Boot", @"Rain Boot", @"Sling Back", @"T-Strap", @"-", nil]; 

    [[NSUserDefaults standardUserDefaults] setObject:shoeStyles forKey:@"shoeStyles"]; 
+1

Возможно, вы захотите рассмотреть вопрос о том, как хранить свои дизайнерские и обувные стили в виде файлов plist, а не жестко кодировать их в вашу программу. – dreamlax

+0

Почему? Они доступны для редактирования, и они назначаются для NSUserDefaults в порядке. Я не знаю, почему люди используют плиты все время ... – Bryan

+0

Причина, по которой люди часто предпочитают использовать plist вместо жесткого кодирования массивов, заключается в том, чтобы избежать возможных поломков кода, если вам когда-либо понадобится их изменить, или если вы когда-либо хотите изменить источник, вы можете легко сделать HTTP, чтобы захватить plist откуда-то и легко импортировать его. –

ответ

1

Вы имеете в виду, что вы задали значение по умолчанию для NSMutableArray, а затем, если вы измените изменяемый массив за пределами значений по умолчанию, вы потеряете изменения?

Если это так, по умолчанию, вероятно, не заметили, что вы изменили массив. Вам нужно создать новый массив и снова отправить -setObject:forKey: (или использовать тот же измененный массив и отправить -setObject:forKey:).

Кстати, документы говорят, что вы можете передавать только NSArray. Это не означает, что вы не можете пройти NSMutableArray, но вам нужно придерживаться духа контракта и не изменять массив, в который вы проходите.

+0

Я не изменяю измененный массив вне значений по умолчанию. Изменения по умолчанию меняются, и когда я регистрирую содержимое NSUserDefaults, я вижу изменения, но когда я выхожу и перезапускаю приложение, изменения не сохраняются. Кроме того, NSMutableArrays устанавливаются и извлекаются точно. – Bryan

+0

В итоге я сделал что-то подобное. спасибо Jeremy – Bryan

+0

@Bryan: Одна вещь, о которой я забыл упомянуть, вам не нужно делать первый запуск. Вы должны просто использовать '-registerDefaults:' некоторое время во время запуска приложения, а затем просто изменять вещи, когда вам нужно. http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/UserDefaults/Tasks/UsingDefaults.html%23//apple_ref/doc/uid/20000719-97292 – JeremyP

1

Когда вы звоните saveUserDefaults?

Я бы также рекомендовал только вызов [NSUserDefaults standardUserDefaults] один раз внутри метода. Просто держать указатель на объект и использовать его снова и снова, так как:

NSMutableArray *designerArray = [[NSMutableArray alloc] initWithObjects: @"Alberta Ferretti" ...;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:designerArray forKey:@"designerArray"]; [defaults synchronize];

Я использовал приведенный выше код с вашим массивом дизайнера и он работал на меня.

+0

Это ничего не делает. Проблема заключается в том, что я распечатываю значения по умолчанию перед тем, как выйти из приложения, и значения верны (изменены). Но когда я выхожу и перезапускаю приложение, значения остаются неизменными. – Bryan

+0

Этот код действительно работает для меня. Поскольку значения в вашем приложении выглядят правильно перед выходом, но не сохраняются для следующего запуска, что подразумевает, что вы не совершаете изменения. Когда вы вызываете saveUserDefaults()? –

+0

Kenny - Интересно, добавив это в saveUserDefaults, это сработало: [standardDefaults setObject: [standardDefaults objectForKey: @ "designerArray"] forKey: @ "designerArray"]; – Bryan

0

Это сработало для меня. Мне в значительной степени пришлось переназначить массив себе.

[standardDefaults setObject:[standardDefaults objectForKey:@"designerArray"] forKey:@"designerArray"]; 
Смежные вопросы