2011-08-03 14 views
5

Estoy creando una aplicación MKMapView y necesito guardar un par de variables de tipo MKMapRect en un plist para remitirlas cuando sea necesario.Cómo guardar MKMapRect en un plist

Sé que MKMapRect tiene MKMapPoint origin y MKMapSize size. Y cada uno tiene 2 valores dobles que se pueden guardar como nsnumber, pero guardarlos parece ser una tarea ardua y, además, tengo que volver a leer los valores y convertirlos en una variable MKMapRect.

Así que mi pregunta es, ¿hay alguna manera fácil de almacenar un MKMapRect y recuperarlo de un plist.

Gracias,
Robin.

Respuesta

7

Uso MKStringFromMapRect para convertirlo en una cadena.

+0

Y cómo obtener el MKMapRect de esa cadena. – Robin

+0

Sí, parece que no hay una función opuesta, no sé por qué plantearía un error con Apple, probablemente podrías usar CGRectFromString y crear un MKMapRect a partir de él, pero para estar seguro es probable que seas mejor que hacer lo que andreamazz sugirió. –

+0

Has presentado un problema de error con el ID de problema de Apple: 9887906 –

0

Probablemente se podría copiar los datos en un MKMapRect CGRect, a continuación, almacenar el CGRect como una cadena con NSStringFromgCGRect() y CGRectFromString()

+0

todavía parece ser mucho de trabajo ... – Robin

+0

4 líneas de código para guardar, 4 para cargar. Voy a pasarlo en una nueva respuesta – andreamazz

4

No:

- (NSString *)save:(MKMapRect)rect 
{ 
    return MKStringFromMapRect(rect); 
} 

- (MKMapRect)load:(NSString *)str 
{ 
    MKMapRect mapRect; 
    CGRect rect = CGRectFromString(str); 
    mapRect.origin.x = rect.origin.x; 
    mapRect.origin.y = rect.origin.y; 
    mapRect.size.width = rect.size.width; 
    mapRect.size.height = rect.size.height; 
    return mapRect; 
} 
+0

bien pero sería más agradable como categoría en NSString. – n13

+0

Tenga en cuenta que el valor de CGRect puede basarse en el tipo de datos 'float' y puede perder precisión porque CLLocationDegree se basa en' double'. – Klaas

2

Hice una categoría para guardar el mapa rect a los valores predeterminados del usuario:

NSUserDefaults + MKMapRect.h

@interface NSUserDefaults (MKMapRect) 

//stores a map rect in user defaults 
-(void)setMapRect:(MKMapRect)mapRect forKey:(NSString*)key; 
//retrieves the stored map rect or returns the world rect if one wasn't previously set. 
-(MKMapRect)mapRectForKey:(NSString*)key; 

@end 

NSUserDefaults + MKMapRect.m

@implementation NSUserDefaults (MKMapRect) 

-(void)setMapRect:(MKMapRect)mapRect forKey:(NSString*)key{ 
    NSMutableDictionary *d = [NSMutableDictionary dictionary]; 
    [d setObject:[NSNumber numberWithDouble:mapRect.origin.x] forKey:@"x"]; 
    [d setObject:[NSNumber numberWithDouble:mapRect.origin.y] forKey:@"y"]; 
    [d setObject:[NSNumber numberWithDouble:mapRect.size.width] forKey:@"width"]; 
    [d setObject:[NSNumber numberWithDouble:mapRect.size.height] forKey:@"height"]; 

    [self setObject:d forKey:key]; 
} 

-(MKMapRect)mapRectForKey:(NSString*)key{ 
    NSDictionary *d = [self dictionaryForKey:key]; 
    if(!d){ 
     return MKMapRectWorld; 
    } 
    return MKMapRectMake([[d objectForKey:@"x"] doubleValue], 
         [[d objectForKey:@"y"] doubleValue], 
         [[d objectForKey:@"width"] doubleValue], 
         [[d objectForKey:@"height"] doubleValue]); 
} 

@end