MKMapView पर सभी एनोटेशन कैसे हटाएं


99

क्या उद्देश्य-सी में सभी प्रदर्शित एनोटेशन के माध्यम से पुनरावृत्ति किए बिना मानचित्र पर सभी एनोटेशन को हटाने का एक सरल तरीका है?

जवाबों:


246

हाँ, यहाँ कैसे है

[mapView removeAnnotations:mapView.annotations]

हालाँकि कोड की पिछली पंक्ति मानचित्र से सभी मानचित्र एनोटेशन "पिन्स" को हटा देगी, जिसमें उपयोगकर्ता स्थान पिन "ब्लू पिन" भी शामिल है। सभी मानचित्र एनोटेशन को हटाने और उपयोगकर्ता के स्थान को मानचित्र पर पिन करने के लिए, ऐसा करने के दो संभावित तरीके हैं

उदाहरण 1, उपयोगकर्ता स्थान एनोटेशन को बनाए रखें, सभी पिन निकालें, उपयोगकर्ता स्थान पिन वापस जोड़ें, लेकिन इस दृष्टिकोण के साथ एक दोष है, यह उपयोगकर्ता के स्थान के पिन को मैप पर ब्लिंक करने का कारण बनेगा, पिन को हटाने के कारण फिर इसे जोड़ना वापस

- (void)removeAllPinsButUserLocation1 
{
    id userLocation = [mapView userLocation];
    [mapView removeAnnotations:[mapView annotations]];

    if ( userLocation != nil ) {
        [mapView addAnnotation:userLocation]; // will cause user location pin to blink
    }
}

उदाहरण 2, मैं व्यक्तिगत रूप से पहली जगह में स्थान उपयोगकर्ता पिन को हटाने से बचना चाहता हूं,

- (void)removeAllPinsButUserLocation2
{
    id userLocation = [mapView userLocation];
    NSMutableArray *pins = [[NSMutableArray alloc] initWithArray:[mapView annotations]];
    if ( userLocation != nil ) {
        [pins removeObject:userLocation]; // avoid removing user location off the map
    }

    [mapView removeAnnotations:pins];
    [pins release];
    pins = nil;
}

1
क्या यह उपयोगकर्ता के स्थान को भी हटा देता है? क्या होगा यदि मैं उपयोगकर्ता स्थान के अलावा सभी एनोटेशन निकालना चाहता हूं?
केविन मेंडोज़ा

1
आपको उपयोगकर्ता स्थान पर किसी भी संदर्भ को सहेजने की आवश्यकता नहीं है। अधिक जानकारी के लिए नीचे मेरा जवाब पढ़ें।
एविएल ग्रॉस

36

यहाँ ऐसा करने का सबसे सरल तरीका है:

-(void)removeAllAnnotations
{
  //Get the current user location annotation.
  id userAnnotation=mapView.userLocation;

  //Remove all added annotations
  [mapView removeAnnotations:mapView.annotations]; 

  // Add the current user location annotation again.
  if(userAnnotation!=nil)
  [mapView addAnnotation:userAnnotation];
}

अच्छा जवाब, उन सभी के माध्यम से पुनरावृत्ति की तुलना में बहुत तेजी से, खासकर यदि आपके पास मुट्ठी भर एनोटेशन हैं।
मैथ्यू फ्रेडरिक

6
किसी एनोटेशन को निकालना तब इसे वापस जोड़ना, पिन को मानचित्र पर ब्लिंक करने का कारण बनता है। कुछ ऐप्स के लिए यह एक बड़ी बात नहीं हो सकती है, लेकिन यदि आप लगातार नए एनोटेशन के साथ मैप को अपडेट कर रहे हैं तो यह उपयोगकर्ता के लिए कष्टप्रद हो सकता है।
राकेट 12

किसी कारण के लिए, मेरा उपयोगकर्ता आवंटन एनोटेशन हमेशा इस पद्धति का उपयोग करके गायब हो जाता है। विक्टर वान ही का समाधान मेरे लिए काम करता है।
स्टीफन बर्न्स

17

उपयोगकर्ता स्थान को छोड़कर सभी एनोटेशन को निकालने का तरीका यहां स्पष्ट रूप से लिखा गया है क्योंकि मुझे लगता है कि मैं फिर से इस उत्तर की तलाश में आऊंगा:

NSMutableArray *locs = [[NSMutableArray alloc] init];
for (id <MKAnnotation> annot in [mapView annotations])
{
    if ( [annot isKindOfClass:[ MKUserLocation class]] ) {
    }
    else {
        [locs addObject:annot];
    }
}
[mapView removeAnnotations:locs];
[locs release];
locs = nil;

धन्यवाद, इसने मेरे लिए कॉपी और पेस्ट और [लोकेशन रिलीज] को हटाने और मैप व्यू को _mapView में बदलने का काम किया। मैं MKDirections के लिए एक महान ट्यूटोरियल का अनुसरण कर रहा था यहाँ devfright.com/mkdirections-tutorial और दिशा-निर्देश प्राप्त करने के बाद पिन निकालना चाहता था। मैंने उस पद्धति की अंतिम पंक्ति के नीचे दिए गए कोड को 'स्पष्ट मार्ग'मिथोड
हेबलग

अपडेट हटाएं एकाधिक - (IBAction) clearRoute: (UIBarButtonItem *) प्रेषक {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay: pathDetails.polyline]; NSMutableArray * locs = [[NSMutableArray आवंटित] init]; for (id <MKAnnotation> annot in [_mapView annotations]) {if ([annot isKindOfClass: [MKUserLocation class]]]) {} और {{locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
हेब्लेग

13

यह संदीप के जवाब से काफी मिलता-जुलता है, सिवाय इसके कि वह उपयोगकर्ता स्थान को फिर से नहीं जोड़ता है, इसलिए नीली डॉट फिर से बंद नहीं करता है।

-(void)removeAllAnnotations
{
    id userAnnotation = self.mapView.userLocation;

    NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
    [annotations removeObject:userAnnotation];

    [self.mapView removeAnnotations:annotations];
}

11

आपको उपयोगकर्ता स्थान पर किसी भी संदर्भ को सहेजने की आवश्यकता नहीं है। सभी की जरूरत है:

[mapView removeAnnotations:mapView.annotations]; 

और जब तक आपने mapView.showsUserLocationसेट किया है YES, तब भी आपके पास मानचित्र पर उपयोगकर्ता स्थान होगा। इस संपत्ति को सेटिंग्स YESमूल रूप से मानचित्र दृश्य को अपडेट करने और उपयोगकर्ता स्थान को अपडेट करने और मानचित्र पर दिखाने के लिए लाने के लिए कहती है। से MKMapView.hटिप्पणियाँ:

// Set to YES to add the user location annotation to the map and start updating its location

मैंने इस प्रारूप का उपयोग करते हुए समाप्त किया: [self.mapView.removeAnnotations (mapView.annotations)]
एडवर्ड हेट

6

स्विफ्ट संस्करण:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}

6

स्विफ्ट 3

if let annotations = self.mapView.annotations {
    self.mapView.removeAnnotations(annotations)
}

2

स्विफ्ट 2.0 सरल और सबसे अच्छा:

mapView.removeAnnotations(mapView.annotations)

0

एक प्रकार के उपवर्ग को हटाने के लिए आप कर सकते हैं

mapView.removeAnnotations(mapView.annotations.filter({$0 is PlacesAnnotation}))

PlacesAnnotationका एक उपवर्ग कहां हैMKAnnotation

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.