3

私はこれを機能させるためにいくつかの異なるチュートリアルを経験してきましたが、初心者が知らないかもしれないいくつかの重要なステップを見逃しているようです.

名前、緯度、経度がリストされた URL に JSON ファイルがあります。それを配列または辞書にインポートするにはどうすればよいですか (違いはわかりません)、それを反復処理して、反復ごとに新しい注釈を作成します。

IOS6、ストーリーボード

_ 追加コード _

ViewController.h

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


@interface ViewController : UIViewController {}

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

@property (nonatomic, strong) NSMutableData *downloadData;

@end

ViewController.m

#import "ViewController.h"
#import "MapViewAnnotation.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _downloadData = [NSMutableData new];

    NSURL *requestURL = [NSURL URLWithString:@"OMITTED/apptest/locations.json"];
    NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_downloadData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    id parsed = [NSJSONSerialization JSONObjectWithData:_downloadData options:kNilOptions error:nil];
    for (NSDictionary *pointInfo in parsed)
    {
        NSLog([parsed objectForKey:@"name"]);
        double xCoord = [(NSNumber*)[parsed objectForKey:@"lat"] doubleValue];
        double yCoord = [(NSNumber*)[parsed objectForKey:@"lon"] doubleValue];
        CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(xCoord, yCoord);


        MKPointAnnotation *point = [MKPointAnnotation new];
        point.coordinate = coords;
        point.title = [parsed objectForKey:@"name"];

        [self.mapView addAnnotation:point]; // or whatever your map view's variable name is
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)viewDidUnload {
    [super viewDidUnload];
    // ARC Problem --- [_mapView release];
    self.mapView = nil;
}

@end
4

2 に答える 2

2

iOS 5には、URLからの生のJSONデータを必要に応じて配列または辞書に変換できるJSONSerializerクラスがあります。

サーバーからデータをダウンロードする必要があります。

NSURL *requestURL = [NSURL URLWithString:@"<your url here>"];
NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];

次に、次のデリゲートメソッドを追加します。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_downloadData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    id parsed = [NSJSONSerialization JSONObjectWithData:_downloadData options:kNilOptions error:nil];
}

_downloadDataは、NSMutableData型のクラスのインスタンス変数またはプロパティです。

そのparsed変数には、サーバーからのデータが含まれます。ポイントのリストの場合はおそらく配列であるため、高速列挙を使用して反復処理できます。

for (NSDictionary *pointInfo in parsed) {
    double xCoord = [(NSNumber*)[parsed objectForKey:@"<key for lat coord>"] doubleValue];
    double yCoord = [(NSNumber*)[parsed objectForKey:@"<key for long coord>"] doubleValue];
    CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(xCoord, yCoord);


    MKPointAnnotation *point = [[MKPointAnnotation new] autorelease];
    point.coordinate = coords;        
    point.title = [parsed objectForKey:@"<key for title>"];  

    [self.mapView addAnnotation:point]; // or whatever your map view's variable name is
}
于 2013-02-13T23:21:09.093 に答える
0

GitHubにNSCodingプロトコルでシリアライザーを使用するオープンソースプロジェクトがあるので、JSONストリームから直接インスタンスを自動的に作成できます。

ここにあります

于 2013-02-13T23:25:05.627 に答える