7
votes

Vérifiez si MapView contient déjà une annotation

J'ai une méthode d'ajout d'annotations secondaires à proximité (Ann2) lorsque je passe sur une autre annotation (Ann1). Mais quand je désélectionne et sélectionnez exactement la même annotation (Ann1), l'Ann2 Re-Crée Soi-même et est à nouveau ajouté. Existe-t-il un moyen de vérifier si l'annotation existe déjà sur la carte et si oui, alors rien n'a ajouté la nouvelle annotation. J'ai déjà vérifié ceci: restreindre l'annotation en double sur MapView mais cela n'a pas aidé. . Tout conseil est apprécié. C'est ce que j'ai jusqu'à présent:

    fixedLocationsPin *pin = [[fixedLocationsPin alloc] init];
        pin.title = [NSString stringWithFormat:@"%@",nearestPlace];
        pin.subtitle = pinSubtitle;
        pin.coordinate = CLLocationCoordinate2DMake(newObject.lat, newObject.lon);

        for (fixedLocationsPin *pins in mapView.annotations) {
            if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate (pins.coordinate))) {
                NSLog(@"already in map");
            }else{
                [mapView addAnnotation:pin];
            }


19 commentaires

Supprimez-vous l'annotation de la carteView n'importe où où


non .. pourquoi le supprimer? Merci..


Vous dites que cela ajoute de nouveau na donc j'ai un doute ....


Je reçois l'Annotation AnimatesDrop, donc je suppose que c'est refaire l'ajout / dupliquer lui-même. Y a-t-il un moyen de voir s'il s'agit d'un autre ou s'il est imminent l'animation seulement?


Vous utilisez ceci si (mkmaprectcontainspoint (mapview.visiblaprect, mkmappointforcoordinate (pins.coordinate))) Il vérifiera les broches avec la région visible de la carte rection est l'autre point avec la carte visible ou non


Vous pouvez l'observer par la couleur PIN devient plus sombre si la goupille est duplication. Vérifiez-le


Oui, c'est .. Ils sont tous deux proches du centre de la carte avec Ann2 près de 50 pixels au-dessus de l'Ann1 (sur une carte à l'écran en plein écran).


@ 08442 Ils refoulent à nouveau. Je viens de vérifier .. L'ombre des épingles devient plus sombre et plus sombre à chaque fois ..


ok ... une fois le déboguer en impression de la carteView.annotations et vérifiez si beaucoup d'annotations arrivent.,


@ 08442 OUI Je reçois +1 classe d'annotation à chaque fois ..


Signifie que votre condition si elle n'est pas satisfaisante, elle est de nouveau en lecture


Essayez de modifier la condition IF comme suit si (mkmaprectContainspoint (MapView.region, mkmappointForcoordinate (pins.coordinate))) peut fonctionner j'espère


Passage 'mkcoordinateegion' au paramètre de type incompatible 'mkmaprect'


Je ne reçois pas une chose pour la première fois que vous ajoutez tout Ponta sur MapView pourquoi voulez-vous ajouter ???? Si je me trompe pour comprendre l'excuse ...


L'Ann2 n'est pas ajouté tant que vous appuyez sur / sélectionner Ann1 ..


Chaque fois que vous n'obtiendrez que deux annotations ou plus ..?


Chaque fois que j'appuie / sélectionner Ann1, l'ANN2 est ajouté. Et chaque fois que vous désélectionnez et sélectionnez Ann1, l'ANN2 est re-ajouté / dupliqué (+1) au lieu de ne rien faire car il a déjà été ajouté.


Si ([MapView.Annotations comptez] == 2) retour; sinon [MapView Addannotation: PIN];


Cela ne fonctionnera pas dans mon cas car les utilisateurs peuvent ajouter leurs propres annotations. Donc, l'Ann1 ne sera donc pas toujours d'un nombre fixe .. Je dois vérifier les coordonnées exactes car la carte peut contenir plus de 30 annotations .. Merci ..


5 Réponses :


4
votes

Votre pour code> La boucle ne vérifie pas si l'annotation est à l'écran, elle vérifie si les coordonnées de la broche sont actuellement dans la zone visible. Même s'il vérifiait si l'objet PIN CODE> était déjà dans le MAPView.Annotations CODE> Il ne serait jamais vrai, car vous venez de créer code PIN code > Quelques lignes plus tôt, il ne peut pas être le même objet que dans le mapviev.annotations code>. Cela pourrait bien avoir les mêmes coordonnées et titres, et c'est ce que vous devez vérifier:

bool found = false;
for (fixedLocationsPin *existingPin in mapView.annotations)
{
  if (([existingPin.title isEqualToString:pin.title] && 
       (existingPin.coordinate.latitude == pin.coordinate.latitude)
       (existingPin.coordinate.longitude == pin.coordinate.longitude))
  { 
    NSLog(@"already in map");
    found = true;
    break;
  }
}    
if (!found)
{
    [mapView addAnnotation:pin];
} 


4 commentaires

Je ne vois pas comment cela fonctionnerait. Bonne idée de vérifier l'égalité dans le titre et les coordonnées, mais la logique semble tort ici. Vous devez ajouter l'annotation une fois que vous êtes sûr que tous les points existants ont été analysés.


Vous avez raison, il doit aller jusqu'au bout de la boucle et être sûr qu'aucun des articles n'est sur le point d'être ajouté, puis l'ajoutez. Je vais mettre à jour le code.


Oui, maintenant cela fonctionnerait. Regarde ma réponse aussi. Bien qu'il soit écrit à Swift, l'avantage est que si une entrée est trouvée, elle existe tout de suite, plutôt que de continuer à analyser inutilement les annotations.


En passant cette réponse, je pense qu'une bonne chose à vérifier est que la broche actuelle de la boucle de la boucle n'est pas égale à la mkuserlocation actuelle (car elle est considérée comme une annotation sur un MKAPView).



-1
votes

Suivre mon commentaire sur la réponse de Craig, je pense que la solution pourrait ressembler à quelque chose comme ceci: xxx pré>

Ce code vous permet de vérifier si une carte contient une annotation donnée. Utilisez ceci dans une boucle "pour" sur toutes vos annotations: P>

for annotation in annotations {
  if mapView.containsAnnotation(annotation) {
    // do nothing
  } else {
    mapView.addAnnotation(annotation)
  }


0 commentaires

1
votes

Annotations forte> existe dans l'objet de la carte, vous devez donc simplement avoir à vérifier

if ( yourmap.annotations.count==0)
{
NSLog(@"no annotations");
}


1 commentaires

Ce code vérifie s'il existe des annotations dans la carteView, non si une annotation donnée est contenue dans la carteView.



1
votes
NSNumber *latCord = [row valueForKey:@"latitude"];
NSNumber *longCord = [row valueForKey:@"longitude"];
NSString *title = [row valueForKey:@"name"];

CLLocationCoordinate2D coord;
coord.latitude = latCord.doubleValue;
coord.longitude = longCord.doubleValue;
MapAnnotation *annotation = [[MapAnnotation alloc]initWithCoordinate:coord withTitle:title];
if([mkMapView.annotations containsObject:annotation]==YES){
    //add codes here if the map contains the annotation.
}else {
    //add codes here if the annotation does not exist in the map.
}

0 commentaires

0
votes
        if (sampleMapView.annotations.count > 0) {             
            sampleMapView.removeAnnotation(detailMapView.annotations.last!)
        }

0 commentaires