2013-01-10 5 views
9

マップ上にある注釈をエンコードしようとしていますが、CLLocationcoordinate2D変数をエンコードできないことを読んでいます。誰も私がこれを解決する方法を知っていますか?ここにいくつかのコードがあります。CLLocationcoordinate2Dのエンコーディング

私はピンをドロップする場所です。ここで

- (void)press:(UILongPressGestureRecognizer *)recognizer { 
    CGPoint touchPoint = [recognizer locationInView:_worldView]; 
    CLLocationCoordinate2D touchMapCoordinate = [_worldView convertPoint:touchPoint toCoordinateFromView:_worldView]; 

    geocoder = [[CLGeocoder alloc]init]; 
    CLLocation *location = [[CLLocation alloc]initWithCoordinate:touchMapCoordinate 
                altitude:CLLocationDistanceMax 
              horizontalAccuracy:kCLLocationAccuracyBest 
              verticalAccuracy:kCLLocationAccuracyBest 
                timestamp:[NSDate date]]; 
    [geocoder reverseGeocodeLocation:location 
       completionHandler:^(NSArray *placemarks, NSError *error) { 
        //NSLog(@"reverseGeocoder:completionHandler: called"); 
        if (error) { 
         //NSLog(@"Geocoder failed with error: %@", error); 
        } else { 
         CLPlacemark *place = [placemarks objectAtIndex:0]; 
         geocodedAddress = [NSString stringWithFormat:@"%@ %@, %@ %@", [place subThoroughfare], [place thoroughfare], [place locality], [place administrativeArea]]; 
         if (UIGestureRecognizerStateBegan == [recognizer state]) { 
          value = [number intValue]; 
          number = [NSNumber numberWithInt:value + 1]; 
          _addressPin = [[MapPoint alloc]initWithAddress:geocodedAddress coordinate:touchMapCoordinate 
                    title:geocodedAddress identifier:number]; 
          NSLog(@"The identifier is %@", number); 
          [[Data singleton].annotations addObject:_addressPin]; 
          [_worldView addAnnotation:_addressPin]; 
          NSLog(@"The number of pins in the annotation array is: %u",[Data singleton].annotations.count); 
         } 
        } 
       }]; 
} 

はMKAnnotationのPROTCOLに準拠して私のクラスである:

#import <CoreLocation/CoreLocation.h> 
#import <MapKit/MapKit.h> 

@interface MapPoint : NSObject <MKAnnotation, NSCoding> 
{ 
} 

- (id)initWithAddress:(NSString*)address 
    coordinate:(CLLocationCoordinate2D)coordinate 
     title:(NSString *)t 
     identifier:(NSNumber *)ident; 


//This is a required property from MKAnnotation 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 

//This is an optional property from MKAnnotataion 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, readonly, copy) NSString *subtitle; 
@property (nonatomic) BOOL animatesDrop; 
@property (nonatomic) BOOL canShowCallout; 

@property (copy) NSString *address; 
@property (copy) NSNumber *identifier; 
@property (nonatomic, copy) NSString *imageKey; 
@property (nonatomic, copy) UIImage *image; 

@end 

import "MapPoint.h" 

@implementation MapPoint 

@synthesize title, subtitle, animatesDrop, canShowCallout, imageKey, image; 
@synthesize address = _address, coordinate = _coordinate, identifier = _indentifier; 

-(id)initWithAddress:(NSString *)address 
     coordinate:(CLLocationCoordinate2D)coordinate 
      title:(NSString *)t 
     identifier:(NSNumber *)ident { 
    self = [super init]; 

    if (self) { 
     _address = [address copy]; 
     _coordinate = coordinate; 
     _indentifier = ident; 

     [self setTitle:t]; 

     NSDate *theDate = [NSDate date]; 

     subtitle = [NSDateFormatter localizedStringFromDate:theDate 
               dateStyle:NSDateFormatterShortStyle 
               timeStyle:NSDateFormatterShortStyle]; 
     } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder { 

    [aCoder encodeObject:_address forKey:@"address"]; 


    [aCoder encodeObject:title forKey:@"title"]; 
    [aCoder encodeObject:_indentifier forKey:@"identifier"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super init]; 
    if (self) { 
     [self setAddress:[aDecoder decodeObjectForKey:@"address"]]; 

    } 
    return self; 
} 

@end

+0

? –

+0

「CLLocationCoordinate2Dをエンコードする」とはどういう意味ですか?ベース64に?または何? –

+0

私はCLLocationCoordinate2D変数をエンコードしようとしていますが、[aCoder encodeObject:_coordinate forKey:@ "Coord"];を試してみます。私はエラーを取得する 'CLLocationCoordinate2D'互換性のないタイプ 'id'の境界を送信する –

答えて

17

ただの二つのフィールドを符号化しますCLLocationCoordinate2D値。

[aCoder encodeDouble:_coordinate.latitude forKey:@"latitude"]; 
[aCoder encodeDouble:_coordinate.longitude forKey:@"longitude"]; 
9

NSValueはNSCodingに準拠しています。あなたはNSValueオブジェクトであなたのCLLocationcoordinate2D変数をボックスすることができます

[coder encodeObject:[NSValue valueWithMKCoordinate:coordinate] forKey:@"coordinate"] 
+0

#import "MapKit/MapKit.h"(およびMapKitフレームワーク)を追加する必要があることを付け加える価値はあります。 – KlimczakM

+3

私はCLLocationCoordinate2Dをエンコードしようとしましたが、 " - [NSKeyedArchiver encodeValueOfObjCType:at:]:このアーカイバは構造体をエンコードできません"というエラーが発生しました。私がここで間違っていることを教えてください。 –

4

CLLocationCoordinate2Dの緯度と経度は、基本的に、あるタイプCLLocationDegreesdoubleを言うの空想方法です。

これは、あなたがそれらをエンコードし、デコードすることができる方法である。

NSString *const kPinCoordinateLatitudeKey = @"kPinCoordinateLatitudeKey"; 
NSString *const kPinCoordinateLongitudeKey = @"kPinCoordinateLongitudeKey"; 

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeDouble:self.coordinate.latitude forKey:kPinCoordinateLatitudeKey]; 
    [encoder encodeDouble:self.coordinate.longitude forKey:kPinCoordinateLongitudeKey]; 
} 

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    if((self = [super init])) { 
     CLLocationDegrees latitude = [decoder decodeDoubleForKey:kPinCoordinateLatitudeKey]; 
     CLLocationDegrees longitude = [decoder decodeDoubleForKey:kPinCoordinateLongitudeKey]; 
     _coordinate = CLLocationCoordinate2DMake(latitude, longitude); 
    } 
    return self; 
} 
2

私はCLLocationプロパティハンドルにNSSecureCodingに準拠してこのような状況を、使用をエンコードすることを決めました。

あなたがCLLocationCoordinate2Dまたはから変換する必要がある場合:あなたが取得しているエラー/動作です何

// Coordinate to Location 
CLLocationCoordinate2D coord; 
CLLocation *loc = [[CLLocation alloc] initWithLatitude:coord.latitude 
              longitude:coord.longitude]; 

// Location to Coordinate 
CLLocationCoordinate2D coord = loc.coordinate; 
関連する問題