Google地图标记不会移除iOS

我正在运行一个线程来每10秒获取驱动程序的位置,并希望从地图中删除添加的标记,但它不工作..

我的代码:

-(void)APiResponse:(id)returnJson { [googleMapsDriverPin setMap:nil]; googleMapsDriverPin = nil; NSMutableArray *driverPins = [[NSMutableArray alloc]init]; for (int x = 0; x < [[returnJson valueForKey:@"drivers"] count]; x++) { CLLocation *driverLocations = [[CLLocation alloc]initWithLatitude:[[[[returnJson valueForKey:@"drivers"] objectAtIndex:x] valueForKey:@"driver_latitude"] doubleValue] longitude:[[[[detail valueForKey:@"drivers"] objectAtIndex:x] valueForKey:@"driver_longitude"] doubleValue]]; [driverPins addObject:driverLocations]; } for (CLLocation *newLocation in driverPins) { googleMapsDriverPin = [[GMSMarker alloc] init]; [googleMapsDriverPin setPosition:newLocation.coordinate]; [googleMapsDriverPin setAnimated:YES]; [googleMapsDriverPin setTitle:@"title"]; [googleMapsDriverPin setSnippet:@"snippet"]; [googleMapsDriverPin setIcon:[GMSMarker markerImageWithColor:[UIColor blackColor]]]; [googleMapsDriverPin setMap:googleMaps]; } } 

它只是不断添加和添加每10秒,而不是删除,请帮助! 谢谢!

它是一种快速和肮脏的select,但如果你想这样去GMSMarker有一个userData属性,你可以用它来标记驱动器引脚

 - (void)apiResponse:(id)returnJson { for (GMSMarker *pin in self.googleMaps.markers) { if (pin.userData == @"Driver Pin"){ pin.map = nil; } } ... for (CLLocation *newLocation in driverPins) { googleMapsDriverPin = [[GMSMarker alloc] init]; ... [googleMapsDriverPin setUserData:@"Driver Pin"]; } } 

更新:

 [self.googleMapsView clear]; 

你目前只存储一个标记,但是你想添加N个标记 – 所以(如撒克逊所说)你需要一个数组来保存所有的引脚:)

 @interface YouClass ... @property(nonatomic, retain) NSMutableArray *googleMapsDriverPins; @end @implementation YourClass ... -(void)APiResponse:(id)returnJson { for(GMSMarker *pin in self.googleMapsDriverPins) { pin.map = nil; } self.googleMapsDriverPins = nil; NSMutableArray *driverPins = [[NSMutableArray alloc]init]; for (int x = 0; x < [[returnJson valueForKey:@"drivers"] count]; x++) { CLLocation *driverLocations = [[CLLocation alloc]initWithLatitude:[[[[returnJson valueForKey:@"drivers"] objectAtIndex:x] valueForKey:@"driver_latitude"] doubleValue] longitude:[[[[detail valueForKey:@"drivers"] objectAtIndex:x] valueForKey:@"driver_longitude"] doubleValue]]; [driverPins addObject:driverLocations]; } self.googleMapsDriverPins = [NSMutableArray arrayWithCapacity:driverPins.count]; for (CLLocation *newLocation in driverPins) { GMSMarker *googleMapsDriverPin = [[GMSMarker alloc] init]; [googleMapsDriverPin setPosition:newLocation.coordinate]; [googleMapsDriverPin setAnimated:YES]; [googleMapsDriverPin setTitle:@"title"]; [googleMapsDriverPin setSnippet:@"snippet"]; [googleMapsDriverPin setIcon:[GMSMarker markerImageWithColor:[UIColor blackColor]]]; [googleMapsDriverPin setMap:googleMaps]; [self.googleMapsDriverPins addObject:googleMapsDriverPin]; } } @end 

在基于引脚id你也可以删除引脚。 这里deletePinId整数是针对选定的引脚ID。

 for(GMSMarker *pin in self.mapView_.markers) { NSLog(@"pin.userData : %@",pin.userData); int pinId1 = [[pin.userData valueForKey:@"pin_id"] integerValue]; if(deltePinId == pinId1 ){ pin.map = nil; } 

}

它看起来像你有一个循环添加多个驱动程序,其中每个分配给成员variablesgoogleMapsDriverPin 。 然后下一次删除googleMapsDriverPin – 但这只会是你添加的最后一个引脚,而不是所有的引脚。

为此,您需要将循环内的每个标记添加到数组中,然后在下一次更新中从地图中删除所有标记。

在Swift 2中:

为您的地图创build一个出口:

 @IBOutlet weak var mapView: GMSMapView! 

创build一个数组来存储所有标记

 var markers = [GMSMarker]() 

像这样创build标记:

  func funcName() { let position = CLLocationCoordinate2DMake(lat, lon) let marker = GMSMarker(position: position) for pin: GMSMarker in self.markers { if pin.userData as! String == "from" { pin.map = nil } } marker.icon = UIImage(named: "navigation-red") marker.userData = "from" marker.map = self.mapView self.markers.append(marker) } 

您可以将userData属性设置为任何您想要的,然后使用该string来删除该标记。当执行funcName函数时,将具有userData作为“from”的所有标记从地图中删除。让我知道如果您有任何疑问。