使用状态恢复将注释存储在地图上

时间:2014-03-10 15:09:02

标签: ios objective-c annotations mkmapview

我在viewDidLoad中的用户位置添加注释,并尝试使用状态恢复存储该注释。 即使应用程序在后台终止,我也希望注释保持在那里。

-(void)viewDidLoad
{
...

self.annotationregion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(self.mapview.userLocation.location.coordinate.latitude, self.mapview.userLocation.location.coordinate.longitude), MKCoordinateSpanMake(0.5, 0.5));


self.parkinglocation = [[SWAnnotation alloc] init];
self.parkinglocation.title = @"Here it is!";
self.parkinglocation.coordinate = self.annotationregion.center;
[self.mapview addAnnotation:self.parkinglocation];

NSLog(@"userlocation: %@", self.mapview.userLocation);

NSNumber *longitudeNumber = [NSNumber numberWithDouble:self.annotationregion.center.longitude];
NSNumber *latitudeNumber = [NSNumber numberWithDouble:self.annotationregion.center.latitude];
self.coordinateArray = @[latitudeNumber,longitudeNumber];

}

 -(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
...
[coder encodeObject:self.coordinateArray forKey:@"CoordinateArray"];
}


-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
...

NSArray *coordinateArray = [coder decodeObjectForKey:@"CoordinateArray"];
self.annotationregion = MKCoordinateRegionMake(CLLocationCoordinate2DMake([coordinateArray[0] doubleValue], [coordinateArray[1] doubleValue]), MKCoordinateSpanMake(1.5,1.5));
self.parkinglocation = [[SWAnnotation alloc] init];
self.parkinglocation.title = @"tata!";
self.parkinglocation.coordinate = self.annotationregion.center;
[self.mapview addAnnotation:self.parkinglocation];
}

注意,在初始viewDidLoad注释中我使用标题“Here it is!”在decodeRestorableStateWithCoder注释中我使用标题“tata!”只是为了看看它正在向我展示哪一个。

现在,当应用程序第一次在后台终止时,这似乎有效。该应用程序启动备份,并带有新标题“tata!”的注释。在正确的位置。 第二次它在后台终止然后开始备份它会向我显示一个注释,其初始标题为“Here it is!”离非洲海岸,当然不是我的位置...... 所以我感到沮丧,我错过了什么?

1 个答案:

答案 0 :(得分:0)

在我看来,当您对实际编码self.coordinateArray的状态进行编码时,但在恢复时使用局部变量NSArray *coordinateArray进行恢复。 因此,当您的应用稍后再次进行编码时,您的self.coordinateArray将为零。

我认为您应该在[self setCoordinateArray: coordinateArray];

之后设置NSArray *coordinateArray = [coder decodeObjectForKey:@"CoordinateArray"];