0

我知道已经有人问过类似的问题,但我只能找到答案。因此,我正在构建一个拥有超过 100 个 Pin 图的应用程序,将其写入实现将是太多了。有人从您以前的经验中知道我如何使用属性列表文件来存储坐标,然后读取它们并将图钉放在我的地图上吗?最好的方法是什么,因为我确实使用过 plist 文件(编辑它们除外)。

有教程吗?

4

2 回答 2

1

这是来自我的一个应用程序:
这是在我的 MapViewController 类中:

    // Add annotations
    NSArray *bikePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *bikeDocumentsDirectory = [bikePath objectAtIndex:0];
    NSString *path = [bikeDocumentsDirectory stringByAppendingPathComponent:@"bikes.plist"];

    NSDictionary* bikesDictionary = [[NSDictionary alloc] initWithContentsOfFile:path];
    GetRacks *racks = [[GetRacks alloc] initWithDictionary:bikesDictionary];

    for(RackAnnotation *rackAnnotation in [racks getRacks])
    {
                [mapView addAnnotation:rackAnnotation];
    }

GetRacks 类中的方法:

-(NSArray*)_parseXmlDictionary:(NSDictionary *)aDictionary
{
    if (aDictionary != NULL && [aDictionary count] > 0) {
        NSArray *locations = [aDictionary objectForKey:@"locations"];

        if (locations != NULL)
        {
            NSMutableArray *resultArray = [[NSMutableArray alloc] init];
            for (NSDictionary *currentResult in locations)
            {
                RackAnnotation *annotation = [[RackAnnotation alloc] init];
                annotation._address = [currentResult objectForKey:@"address"];
                annotation._id = [currentResult objectForKey:@"id"];
                annotation._information = [currentResult objectForKey:@"id"];
                annotation._stationType = [currentResult objectForKey:@"stationType"];
                annotation._readyBikes = [currentResult objectForKey:@"ready_bikes"];
                annotation._emptyLocks = [currentResult objectForKey:@"empty_locks"];
                annotation._lastUpdated = [currentResult objectForKey:@"last_update"];

                NSNumber *online = [currentResult objectForKey:@"online"];
                annotation._online = [online boolValue];

                CLLocationDegrees latitude = [[[currentResult objectForKey:@"coordinate"] objectForKey:@"latitude"] floatValue];
                CLLocationDegrees longitude = [[[currentResult objectForKey:@"coordinate"] objectForKey:@"longitude"] floatValue];
                CLLocationCoordinate2D location;
                location.latitude = latitude;
                location.longitude = longitude;

                annotation._coordinate = location;

                [resultArray addObject:annotation];
            }

            return resultArray;
        }
        else {
            return NULL;
        }
    }
    else {
        return NULL;
    }
}

机架注释:RackAnnotation.h

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

@interface RackAnnotation : NSObject <MKAnnotation> {
    NSString *_sub;

    NSString *_id;
    NSString *_address;
    NSString *_information;
    NSNumber *_stationType;
    NSString *_readyBikes;
    NSString *_emptyLocks;
    NSString *_lastUpdated;
    CLLocationCoordinate2D _coordinate;
    BOOL _online;
    CLLocationDistance _distance;
}

@property (nonatomic, strong) NSString *_sub;

@property (nonatomic, strong) NSString *_id;
@property (nonatomic, strong) NSString *_address;
@property (nonatomic, strong) NSString *_information;
@property (nonatomic, strong) NSNumber *_stationType;
@property (nonatomic, strong) NSString *_readyBikes;
@property (nonatomic, strong) NSString *_emptyLocks;
@property (nonatomic, strong) NSString *_lastUpdated;
@property (nonatomic, assign) CLLocationCoordinate2D _coordinate;
@property (nonatomic, assign) BOOL _online;
@property (nonatomic, assign) CLLocationDistance _distance;

- (NSNumber*)stationType;
- (NSString*)getInformation;
- (void)setSubTitle:(NSString*)newTitle;

- (NSString*)title;
- (NSString*)subtitle;
- (CLLocationCoordinate2D)coordinate;

@end

机架注释.m:

#import "RackAnnotation.h"

@implementation RackAnnotation

@synthesize _sub, _id, _address, _information, _stationType, _readyBikes, _emptyLocks, _lastUpdated, _coordinate, _online, _distance;

#pragma mark Annotation functions

- (CLLocationCoordinate2D)coordinate
{
    return _coordinate;
}

- (NSString*)title
{
    return _address;
}

- (NSString*)subtitle
{
    return _sub;
}

#pragma mark -

@end

plist 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>version</key>
    <string></string>
    <key>locations</key>
    <array>
        <dict>
            <key>id</key>
            <string>1</string>
            <key>address</key>
            <string>Djurgården Allmänna gränd</string>
            <key>information</key>
            <string></string>
            <key>stationType</key>
            <real>1</real>
            <key>ready_bikes</key>
            <string>0</string>
            <key>empty_locks</key>
            <string>0</string>
            <key>last_update</key>
            <string>2012-05-03 16:50:35</string>
            <key>coordinate</key>
            <dict>
                <key>latitude</key>
                <real>59.3242468</real>
                <key>longitude</key>
                <real>18.0948995</real>
            </dict>
            <key>online</key>
            <real>0</real>
        </dict>
    </array>
</dict>
</plist>
于 2012-05-03T19:13:21.997 回答
0

您还可以将注释存储在字典中,将它们全部放在一个数组中,然后将其保存在 NSUserDefaults 中。

像这样:

    NSString *latitude = [NSString stringWithFormat:@"%.06f", latitude];//latitude is a double here
    NSString *longitude = [NSString stringWithFormat:@"%.06f", longitude];//longitude is a double here
    NSString *title = [NSString stringWithFormat:@"%@", title];

    NSDictionary *annotation = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:latitude, longitude, title, nil] forKeys:[NSArray arrayWithObjects:@"latitude", @"longitude", @"title", nil]];

    NSMutableArray *annotations = [[pref objectForKey:@"annotations"] mutableCopy];
    [annotations addObject:annotation];

    NSUserDefaults pref = [[NSUserDefaults alloc] init];
    [pref setObject:annotations forKey:@"annotations"];

然后阅读注释,你会这样:

 NSMutableArray *annotations = [[pref objectForKey:@"annotations"] mutableCopy];

 for (NSDictionary *annotation in annotations)
 {
    latitude = [annotation objectForKey:@"latitude"]];
    longitude = [annotation objectForKey:@"longitude"]];
    title = [annotation objectForKey:@"title"]];
    //create an MKAnnotation and add to your maview
 }
于 2012-05-11T01:09:25.780 回答