2013-01-10 17 views
9

Próbuję kodować adnotacje znajdujące się na mapie, ale czytałem, że nie mogę kodować zmiennych CLLocationcoordinate2D. Czy ktoś wie, jak mogę to rozwiązać? Oto kod.Kodowanie obiektu CLLocationcoordinate2D

To tam wpadnę szpilki:

- (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); 
         } 
        } 
       }]; 
} 

Oto moja klasa, która jest zgodna z protcol MKAnnotation:

#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

Co to jest błąd/zachowanie otrzymujesz? –

+0

Co masz na myśli przez "kodowanie CLLocationCoordinate2D"? Do Base-64? Albo co? –

+0

Tak więc próbuję kodować zmienną CLLocationCoordinate2D, ale gdy próbuję [aCoder encodeObject: _coordinate forKey: @ "Coord"]; Pojawia się błąd Wysyłanie "CLLocationCoordinate2D" obwodu niekompatybilnego typu "id" –

Odpowiedz

17

Wystarczy zakodować dwa polach CLLocationCoordinate2D wartość.

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

NSValue jest zgodny z NSCoding. Można box zmienną CLLocationcoordinate2D w obiekcie NSValue:

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

Niezły, warto dodać, że trzeba dodać #import "MapKit/MapKit.h" (i framework MapKit). – KlimczakM

+3

Podczas próby kodowania CLLocationCoordinate2D wystąpił błąd "- [NSKeyedArchiver encodeValueOfObjctype: at:]: ten archiver nie może kodować struktur" ". Powiedz mi, co robię źle tutaj. –

4

długość i szerokość geograficzna CLLocationCoordinate2D „s są typu CLLocationDegrees która jest w istocie, fantazyjny sposób na powiedzenie double.

ten sposób można zakodować i ich dekodowania:

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

postanowiłem zakodować użyć dojścia CLLocation właściwość ta sytuacja, która jest zgodna z NSSecureCoding.

Jeśli trzeba konwertować do lub z CLLocationCoordinate2D:

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

// Location to Coordinate 
CLLocationCoordinate2D coord = loc.coordinate; 
Powiązane problemy