4

MKMapViewにいくつかの注釈を追加する必要があり(たとえば、国の各都市に1つ)、すべての都市の緯度と経度ですべてのCLLocation2Dを初期化したくありません。配列で可能だと思うので、これが私のコードです。

NSArray *latit = [[NSArray alloc] initWithObjects:@"20", nil]; // <--- I cannot add more than ONE object
NSArray *longit = [[NSArray alloc] initWithObjects:@"20", nil]; // <--- I cannot add more than ONE object

// I want to avoid code like location1.latitude, location2.latitude,... locationN.latitude...

CLLocationCoordinate2D location;
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];

for (int i=0; i<[latit count]; i++) {
    double lat = [[latit objectAtIndex:i] doubleValue];
    double lon = [[longit objectAtIndex:i] doubleValue];
    location.latitude = lat;
    location.longitude = lon;
    annotation.coordinate = location;
    [map addAnnotation: annotation];
}

わかりました。NSArrayのlatitとlongitに1つのオブジェクトを残しておけば、マップ上に1つの注釈があります。しかし、配列アプリのビルドに複数のオブジェクトを追加しても、EXC_BAD_ACCESS(code = 1 ...)でクラッシュした場合。問題は何ですか、または冗長なコードなしでいくつかの注釈を追加するための最良の方法は何ですか?ありがとうございました!

4

1 に答える 1

3

常に同じ注釈オブジェクトを使用しています。これは次のとおりです。

MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];

forループで置き換えるか、マップに追加する前にコピーします。

説明:これは、MKAnnotationプロトコル にある注釈プロパティです。

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

ご覧のとおり、オブジェクトをコピーしていないため、常に同じ注釈を追加すると、注釈が重複することになります。時間1で座標(20,20)の注釈を追加すると、時間2で注釈座標を(40,40)に変更してマップに追加しますが、これは同じオブジェクトです。

NSNumberまた、その中にオブジェクトを配置することはお勧めしません。代わりに、座標を格納するために作成されているため、一意の配列を作成し、CLLocationオブジェクトで埋めます。CLLocationクラスには次 のプロパティがあります。

@property(readonly, NS_NONATOMIC_IPHONEONLY) CLLocationCoordinate2D;

これも不変オブジェクトであるため、オブジェクトを作成するときにこのプロパティを初期化する必要があります。initWithLatitude:longitude:メソッドを使用します:

- (id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude;

したがって、コードのより良いバージョンを書くことができます。

#define MakeLocation(lat,lon) [[CLLocation alloc]initWithLatitude: lat longitude: lon];

NSArray* locations= @[ MakeLocation(20,20) , MakeLocation(40,40) , MakeLocation(60,60) ];

for (int i=0; i<[locations count]; i++) {
    MKPointAnnotation* annotation= [MKPointAnnotation new];
    annotation.coordinate= [locations[i] coordinate];
    [map addAnnotation: annotation];
}
于 2013-01-10T12:36:15.820 に答える