如何使用此代码保存多个MapAnnotations?

时间:2014-01-25 22:45:11

标签: ios mkmapview nsuserdefaults mkannotation

在我的mapview中,用户可以通过点击屏幕制作自己的地图图钉。他可以设置多个引脚。但是,我的保存代码只保存了他所做的最后一个引脚而不是之前的引脚。如何使它保存以前的?

- (void)addPinToMap:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan)
        return;

    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];
    CLLocationCoordinate2D touchMapCoordinate =
    [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];

     NSMutableArray *pincoords = [[NSMutableArray alloc] init];



    CLLocationCoordinate2D coordinate = { touchMapCoordinate.latitude, touchMapCoordinate.longitude };
[pincoords addObject:[NSValue valueWithBytes:&coordinate objCType:@encode(CLLocationCoordinate2D)]];


    MapAnnotation *toAdd = [[MapAnnotation alloc]init];

    toAdd.coordinate = touchMapCoordinate;
    toAdd.title = @"Svampe Spot";

    [self.mapView addAnnotation:toAdd];

    //Save pin section..

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:pincoords forKey:@"saveCoords"];
[userDefaults synchronize];
}
编辑:所以我做了一些改变。我创建了一个NSMutable数组并添加了坐标。但是,应用程序在尝试创建引脚时会终止:[NSUserDefaults setObject:forKey:]:尝试插入非属性列表对象。

每当我尝试将坐标添加到可变数组时,我似乎得到了那条消息,我做错了什么?

1 个答案:

答案 0 :(得分:0)

每次向用户默认值写入新引脚时,它都会覆盖旧引脚。相反,将NSArray或NSMutableArray写入用户默认值并从中添加/删除引脚。

更新: 首先,需要从用户默认值复制NSMutableArray,而不是alloc / inited。这样,数组就已经包含了之前保存的点:

NSMutableArray *pincoords = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"saveCoords"];

这将返回一个包含先前保存坐标的可变数组。

至于你用来存储数组中坐标的方法,我认为你有正确的想法,但我个人从来没有这样做过。 NSArrays只能存储对象,而CLLocationCoordinate2D不是一个对象(可能是像NSRect这样的C结构,我之前从未使用过它)。它需要转换为符合NSCoding的对象,例如NSString,NSNumber或NSDictionary。你可以做的是创建一个函数来手动输入坐标值(包装在NSNumber中)到NSDictionary(使用@“Lat”和@“Long”等键作为坐标),然后将NSDictionary存储在你的mutable中阵列。