1

NSArray呼ばれるカスタムオブジェクトがありますProximityProximityAnnotation次のような新しいものを作成して、これらをマップに追加します。

// Add the annotations to the map
if (self.proximityItems) {
    for (Proximity *proximity in self.proximityItems) {

        // Create a pin
        ProximityAnnotation *proximityAnnotation = [[ProximityAnnotation alloc] init];
        proximityAnnotation.coordinate = CLLocationCoordinate2DMake([proximity.latitude doubleValue], [proximity.longitude doubleValue]);
        proximityAnnotation.title = proximity.title;
        proximityAnnotation.subtitle = NSLocalizedString(@"Drag to change location", nil);
        [self.map addAnnotation:proximityAnnotation];

    }//end

    // Create the map rect
    MapUtility *util = [[MapUtility alloc] init];
    [util zoomMapViewToFitAnnotations:self.map animated:YES];
}//end

これはうまくいきます。

ここで、注釈をドラッグするときに、配列ProximityAnnotationに含まれている対応するオブジェクトを更新したいと思います。proximityItems私は次のことを行うことによってこれを行おうとしています:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState {

    // Get the coordiante
    if ([annotationView.annotation isKindOfClass:[ProximityAnnotation class]] && newState == MKAnnotationViewDragStateEnding) {
        ProximityAnnotation *annotation = (ProximityAnnotation *)annotationView.annotation;
        CLLocationCoordinate2D coordinate = annotation.coordinate;

        // Find the annotation that matches
        for (Proximity *proximity in self.proximityItems) {
            NSLog(@"%f == %f && %f == %f && %@ == %@", [proximity.latitude doubleValue], coordinate.latitude, [proximity.longitude doubleValue], coordinate.longitude, annotation.title, proximity.title);
            if ([proximity.latitude doubleValue] == coordinate.latitude && [proximity.longitude doubleValue] == coordinate.longitude && [annotation.title isEqualToString:proximity.title]) {

                // Update the proximity item
                proximity.longitude = [NSNumber numberWithDouble:coordinate.longitude];
                proximity.latitude = [NSNumber numberWithDouble:coordinate.latitude];

                break;
            }
        }//end

    }//end

}//end

残念ながら、マップ上に注釈が1つしかない場合でも、これは一致しないようです。これが私のログから記録されたものNSLogです:

37.627946 == 37.622267 && -122.431599 == -122.435596 && Testlocation == Testlocation

不思議なことに、double値は少しずれているように見えますが、理由はわかりません。

元のオブジェクトを更新できるように、注釈を配列内のオブジェクトに一致させるためのより良い方法はありますか?

4

1 に答える 1

1

注釈が新しい場所にドラッグされているため、座標値は「オフ」になっている可能性があります。

値が等しい場合でも、オブジェクトの同等性のテストとして浮動小数点数を比較することはお勧めしません。

代わりに、次のオプションをお勧めします。

  • Proximityクラス内のソースオブジェクトへの参照を追加しProximityAnnotation、アノテーションを作成するときに設定します(例proximityAnnotation.sourceProximity = proximity;)。次に、元のProximityオブジェクトを更新するために、アノテーション自体から直接オブジェクトへの参照を取得できます。
  • ProximityAnnotationクラスを削除し、Proximityクラス自体にMKAnnotationプロトコルを実装させます。この場合、更新は必要ない場合があります。
于 2012-10-17T18:37:50.550 に答える