0

以下に示すように、このコードに遭遇しました。次のコードでは、注釈を 1 つしか保存できませんでしたが、注釈の配列があり、単一の NSUserDefaults でそれらを保存できませんでした。

  To save:

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setDouble:location.latitude forKey:@"savedCoordinate-latitude"];
    [ud setDouble:location.longitude forKey:@"savedCoordinate-longitude"];
    [ud setBool:YES forKey:@"savedCoordinate-exists"];
    [ud synchronize];

編集:

 -(void)viewDidLoad
        NSUserDefaults *ud=[NSUserDefaults standardUserDefaults];
            if([ud boolForKey:@"save-exist"])
            { NSMutableArray *udAnnotations=[[NSMutableArray alloc]initWithArray:
[ud objectForKey:@"annotationsArray"]];
                NSLog(@"%d",[udAnnotations count]);
            }
            else{
            [self addAnno];
            }

    -(void)addAnno
    {

    [mapView addAnnotations:annotationArray];
    NSUserDefaults *ud=[NSUserDefaults standardUserDefaults];
    [ud setObject:annotationArray forKey:@"annotationsArray"];
    [ud setBool:YES forKey:@"save-exist"];
    [ud synchronize];

}
4

1 に答える 1

1

すでに配列があるので、単純に and を使用setObject:forKey:しますarrayForKey:

元の配列のオブジェクトは直接保存できるタイプではないため、データを辞書に保存します。

NSMutableArray *saveData = [[NSMutableArray alloc] initWithCapacity:originalData.count];
for(id location in originalData) {
    [saveData addObject:@{@"lat":[location latitude], @"lon":[location longitude]}];
}
[[NSUserDefaults standardUserDefaults] setObject:saveData forKey:@"annotationsArray"];

取得時に変換します。

NSMutableArray *restoredData = [[NSMutableArray alloc] init];
for(NSDictionary *data in [[NSUserDefaults standardUserDefaults] arrayForKey:@"annotationsArray"]) {
    [restoredData addObject:[[Location alloc] initWithLat:data[@"lat"] andLon:data[@"lon"]]];
}
// if restoredData.count is 0, there were no stored objects.

いくつかのメモ:

  • ARC を使用していない場合は、割り当てられたオブジェクトを解放することを忘れないでください。
  • これは、新しいオブジェクティブ c オブジェクト リテラル構文とディクショナリ アクセス構文を使用します。xcode 4.5 を使用していない場合は、従来の方法で構築してアクセスする必要がありますdictionaryWithObjectsAndKeys:objectForKey:
于 2012-10-04T02:51:25.733 に答える