代码之家  ›  专栏  ›  技术社区  ›  Bryan

nsuserdefaults会话之间不保存可更改数组

  •  1
  • Bryan  · 技术社区  · 14 年前

    我在nsuserdefaults中存储了一个nsmutablearray。可变数组已正确编辑,编辑结果可通过以下方式查看:

    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"];
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   JeremyP    14 年前

    您的意思是将默认值设置为nsmutablearray,然后如果您在默认值之外更改可变数组,您会丢失更改吗?

    如果是这样,默认值可能没有注意到您已经更改了数组。您需要创建一个新数组并发送 -setObject:forKey: 再次(或使用相同的可变数组并发送 -设置对象:分叉: )

    顺便说一下,医生说你只能通过一个NSARRAY。这并不意味着你不能通过NSmutableArray,但你需要保持合同精神,而不是改变你所传递的数组。

        2
  •  1
  •   Kenny Wyland    14 年前

    何时调用saveuserdefaults?

    我还建议只在方法内调用一次[nsUserDefaults StandardUserDefaults]。只需保留一个指向对象的指针,然后反复使用它,如下所示:

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

    nsuserdefaults*defaults=[nsuserdefaults standarduserdefaults]; [默认设置对象:DesignerArray Forkey:@“DesignerArray”]; [默认同步];

    我在你的设计器数组中使用了上面的代码,它对我很有用。

        3
  •  0
  •   Bryan    14 年前

    这对我很有用。我几乎必须重新分配数组本身。

    [standardDefaults setObject:[standardDefaults objectForKey:@"designerArray"] forKey:@"designerArray"];