【问题标题】:How to save MKMapRect in a plist如何将 MKMapRect 保存在 plist 中
【发布时间】:2011-08-03 08:16:15
【问题描述】:

我正在创建一个 MKMapView 应用程序,需要在 plist 中保存几个 MKMapRect 类型变量,以便在需要时引用它们。

我知道 MKMapRect 有MKMapPoint originMKMapSize size。它们每个都有 2 个可以保存为 nsnumber 的双精度值,但保存所有这些值似乎需要做很多工作,最重要的是,我必须读回这些值并将它们转换为 MKMapRect 变量。

所以我的问题是,有没有简单的方法来存储 MKMapRect 并从 plist 中取回它。

谢谢,
罗宾。

【问题讨论】:

    标签: iphone objective-c map plist mapkit


    【解决方案1】:

    使用MKStringFromMapRect 将其转为字符串。

    【讨论】:

    • 以及如何从该字符串中获取 MKMapRect。
    • 是的,似乎没有相反的功能,不知道为什么我会向 Apple 提出错误,您可能会使用 CGRectFromString 并从中创建一个 MKMapRect,但为了安全起见可能会更好地按照 andreamazz 的建议去做。
    • 你提出了一个与 Apple 问题 ID 相关的错误问题:9887906
    • '你提出了一个错误'应该是'我提出了一个错误'
    • 嘿,谢谢,如果他们回复您有任何反馈,请告诉我。您也可以在 openradar 上报告相同的错误,以便人们可以看到您的错误报告的进度。无论如何,谢谢。
    【解决方案2】:

    那里:

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

    【讨论】:

    • 不错,但作为 NSString 上的一个类别会更好。
    • 请记住,CGRect 值可能基于 float 数据类型,并且您可能会丢失精度,因为 CLLocationDegree 基于 double
    【解决方案3】:

    我创建了一个类别来将地图矩形保存到用户默认值:

    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
    

    【讨论】:

      【解决方案4】:

      您可以将 MKMapRect 数据复制到 CGRect 中,然后使用 NSStringFromgCGRect() 和 CGRectFromString() 将 CGRect 存储为字符串

      【讨论】:

      • 4 行代码要保存,4 行要加载。我会在一个新的答案中过去
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多