11

注釈の座標が常に更新されているマップビューがありますが、setCoordinateを使用すると、注釈が移動しません。注釈を更新して座標を反映するにはどうすればよいですか?

- (void)updateUnits {

    PFQuery *query = [PFQuery queryWithClassName:@"devices"];
    [query whereKeyExists:@"location"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

        if (!error) {

            for (PFObject *row in objects) {

                PFGeoPoint *geoPoint = [row objectForKey:@"location"];
                CLLocationCoordinate2D coord = { geoPoint.latitude, geoPoint.longitude };

                for (id<MKAnnotation> ann in mapView.annotations) {

                    if ([ann.title isEqualToString:[row objectForKey:@"deviceid"]]) {

                        [ann setCoordinate:coord];

                        NSLog(@"latitude is: %f" , coord.latitude);
                        NSLog(@"Is called");
                        break;
                    }
                    else {

                        //[self.mapView removeAnnotation:ann];
                    }
                }
            }
        }
        else {

        }
    }];
}
4

7 に答える 7

18

更新(ソリューションを反映するため):

独自のカスタム注釈を持ち、setCoordinate を実装したり、座標を合成したりすると、問題が発生する可能性があります。

ソース: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html

以前の解決策:

すべての注釈を削除してから、再度追加することができます。

[mapView removeAnnotations:[mapView.annotations]];

[mapView addAnnotations:(NSArray *)];

または、それらを削除して 1 つずつ追加し直します。

for (id<MKAnnotation> annotation in mapView.annotations)
{
    [mapView removeAnnotation:annotation];
    // change coordinates etc
    [mapView addAnnotation:annotation]; 
}
于 2013-01-03T02:30:04.173 に答える
9

バックグラウンド スレッドで UI を変更しようとするのではなく、追加の注釈をメイン スレッドにディスパッチする

dispatch_async(dispatch_get_main_queue()) {
    self.mapView.addAnnotation(annotation)
}
于 2016-02-11T20:42:03.353 に答える
8

ネイサンの答えのSwift 3.0バージョン(ネイサンに感謝):

DispatchQueue.main.async {
    mapView.addAnnotation(annotation)
}

補足として、ネイサンの答えには、はるかに多くの賛成票が必要です。私は実際にアノテーションを削除するためにこの助けが必要でした.同じ問題が存在し、更新をメインキューにディスパッチすることで修正されます.

于 2017-08-07T22:16:10.073 に答える