【问题标题】:Google Maps markers not removing iOS谷歌地图标记未删除 iOS
【发布时间】:2016-08-15 17:27:08
【问题描述】:

我正在运行一个线程以每 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秒不断添加和添加,而不是删除,请帮助! 谢谢!

【问题讨论】:

  • 使用 MKMapView 时,您可以使用 [mapView removeAnnotations:mapView.annotations] 删除所有引脚
  • 试试[mapView clear]; (其中 mapView 是您的 GMSMapView); ..or.. [googleMaps clear];如果 googleMaps 是您的 GMSMapView
  • @TonyMkenu 感谢您的回答,问题是,这些标记是驱动程序,我也想在地图上保留 MY CURRENT POSITION 标记,如果我清除地图,它会清除所有标记,我只想每 10 秒更新一次驱动程序位置.. :( 之后尝试添加我当前的位置,但只在需要时显示标记?任何帮助将不胜感激!谢谢

标签: iphone ios objective-c google-maps-sdk-ios


【解决方案1】:

这是一种快速而肮脏的选择,但如果您想这样做,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];

【讨论】:

  • 重点是他一开始没有数组
  • 这 100% 有效!太感谢了!我不知道userData,下次它可能会派上用场!感谢所有答案,但这是最好的:)
【解决方案2】:

基于 pin id,您还可以删除 pin。 这里 deletePinId 整数是用于选定的 pin 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;
 }

}

【讨论】:

    【解决方案3】:

    您目前只存储一个标记,但您想添加 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
    

    【讨论】:

    • 您好,感谢您的回答,但收到警告信号:“集合表达式类型 'GMSMarker *' 可能无法响应 'countByEnumeratingWithState:objects:count:'” ...猜猜这意味着它可以' t 循环,如果它只有 1 个对象吗?
    • 这意味着我在某处错过了一个 s 或者这意味着你复制错了 ;) ... 错误说你试图枚举 GMSMarker 而不是包含 0-n GMSMarkers 的数组,显然这不会不行。
    • self.googleMapDriverPins = self.googleMapsDriverPins :) (顺便说一句:我当然是内联写的,所以当然可能有错别字)
    【解决方案4】:

    看起来您有一个添加多个驱动程序的循环,每个驱动程序都分配给成员变量googleMapsDriverPin。然后下次它会删除 googleMapsDriverPin - 但这只是您添加的最后一个引脚,而不是全部。

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

    【讨论】:

    • 我确实尝试删除它们,但它不起作用:[googleMapsDriverPin setMap:nil]; googleMapsDriverPin = nil;
    • 这只会删除最后一个,而不是全部。
    • ..你是对的!只删除最后一个!那么还有什么其他方法可以添加一组标记以便能够在下次更新时将它们全部删除?感谢您的帮助!
    【解决方案5】:

    在 Swift 2 中:

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

    @IBOutlet weak var mapView: GMSMapView!
    

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

    var markers = [GMSMarker]()
    

    像这样创建标记:

        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 属性设置为您想要的任何内容,然后使用该字符串删除该标记。执行 funcName 函数时,所有 userData 为“来自”的标记都将从地图中删除。如果您知道请告诉我有任何疑问。

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2013-04-10
      • 2012-10-17
      • 2018-10-13
      • 1970-01-01
      • 2017-02-10
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多