วิธีการลบคำอธิบายประกอบทั้งหมดบน MKMapView


100

มีวิธีง่ายๆในการลบคำอธิบายประกอบทั้งหมดบนแผนที่โดยไม่ต้องทำซ้ำผ่านคำอธิบายประกอบที่แสดงทั้งหมดใน Objective-c หรือไม่?

คำตอบ:


247

ใช่นี่คือวิธีการ

[mapView removeAnnotations:mapView.annotations]

อย่างไรก็ตามบรรทัดรหัสก่อนหน้านี้จะลบคำอธิบายประกอบแผนที่ "PINS" ทั้งหมดออกจากแผนที่รวมถึงหมุดตำแหน่งของผู้ใช้ "Blue Pin" หากต้องการลบคำอธิบายประกอบแผนที่ทั้งหมดและคงหมุดตำแหน่งของผู้ใช้ไว้บนแผนที่มีสองวิธีที่ทำได้

ตัวอย่างที่ 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
สิ่งนี้จะลบตำแหน่งของผู้ใช้ด้วยหรือไม่ จะเป็นอย่างไรหากฉันต้องการลบคำอธิบายประกอบทั้งหมดนอกเหนือจากตำแหน่งของผู้ใช้
kevin Mendoza

1
คุณไม่จำเป็นต้องบันทึกการอ้างอิงใด ๆ ไปยังตำแหน่งของผู้ใช้ อ่านคำตอบของฉันด้านล่างสำหรับข้อมูลเพิ่มเติม
Aviel Gross

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];
}

คำตอบที่ดีเร็วกว่าการทำซ้ำทุกคำโดยเฉพาะอย่างยิ่งหากคุณมีคำอธิบายประกอบมากกว่าหนึ่งกำมือ
Matthew Frederick

6
การลบคำอธิบายประกอบแล้วเพิ่มกลับทำให้หมุดกะพริบบนแผนที่ อาจไม่ใช่เรื่องใหญ่สำหรับบางแอพ แต่อาจเป็นเรื่องที่น่ารำคาญสำหรับผู้ใช้หากคุณอัปเดตแผนที่ด้วยคำอธิบายประกอบใหม่ ๆ อยู่เสมอ
RocketMan

ด้วยเหตุผลบางประการคำอธิบายประกอบ userLocation ของฉันมักจะหายไปโดยใช้วิธีนี้ วิธีแก้ปัญหาของ Victor Van Hee ใช้ได้ผลกับฉัน
Stephen Burns

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;

ขอบคุณสิ่งนี้ใช้ได้ผลสำหรับฉันด้วยการคัดลอกและวางและลบ [locs release] และเปลี่ยน mapView เป็น _mapView ฉันกำลังติดตามบทช่วยสอนที่ยอดเยี่ยมสำหรับ MKDirections ที่นี่devfright.com/mkdirections-tutorialและต้องการลบพินหลังจากได้รับเส้นทาง ฉันเพิ่มรหัสใต้บรรทัดสุดท้ายของวิธีการนั้นในวิธี 'เส้นทางที่ชัดเจน'
Hblegg

อัปเดตลบหลายรายการ - (IBAction) clearRoute: (UIBarButtonItem *) ผู้ส่ง {self.destinationLabel.text = nil; self.distanceLabel.text = ศูนย์; self.steps.text = ศูนย์; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray จัดสรร] init]; สำหรับ (id <MKAnnotation> หมายเหตุใน [_mapView annotations]) (if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg

13

สิ่งนี้คล้ายกับคำตอบของ Sandip มากยกเว้นว่าจะไม่เพิ่มตำแหน่งของผู้ใช้อีกครั้งเพื่อให้จุดสีน้ำเงินไม่กระพริบและปิดอีกครั้ง

-(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)]
Edward Hasted




0

หากต้องการลบคลาสย่อยประเภทหนึ่งคุณสามารถทำได้

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

ที่PlacesAnnotationเป็น subclass ของMKAnnotation

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.