2013-05-15 54 views
0

我運行一個線程來獲取驅動程序的位置,每10秒,想從地圖中刪除添加的標記,但它不工作..谷歌地圖標記不刪除的iOS

我的代碼:

-(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秒而不刪除,請幫助! 謝謝!

+0

當使用MKMapView時,您可以使用'[mapView removeAnnotations:mapView.annotations]'去除所有的引腳 –

+2

try [mapView clear]; (其中mapView是你的GMSMapView); ..或[googleMaps清除];如果googleMaps是你的GMSMapView – TonyMkenu

+0

@TonyMkenu感謝你的回答,事情是,這些標記是驅動程序,我想保留我的當前位置標記在地圖上,如果我清除地圖清除所有的標記,我只是想每10秒鐘更新驅動程序的位置。:(之後嘗試添加我的當前位置,但僅在需要時顯示標記?任何幫助,將不勝感激!謝謝 – emotality

回答

5

它是一種快速,髒的選擇,但如果你想採用這種方式GMSMarker有,你可以用它來標記駕駛針的用戶數據屬性

- (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]; 
+0

的一點是,他不沒有數組在首位 –

+0

公平點。應該已經self.googleMaps.markers –

+0

撤銷downvote :) –

0

它看起來像你有一個循環添加多個驅動程序,其中每個驅動程序分配給成員變量googleMapsDriverPin。然後下一次它將刪除googleMapsDriverPin - 但這只是您添加的最後一個引腳,而不是所有引腳。

爲此,您需要將循環內的每個標記添加到數組中,然後在下一次更新中從地圖中刪除所有標記。

+0

我嘗試刪除它們,但它不起作用:[googleMapsDriverPin setMap:nil]; googleMapsDriverPin = nil; – emotality

+0

這隻會刪除最後一個,而不是全部。 –

+0

..你是對的!只刪除最後一個!那麼我還可以通過其他方式添加一組標記,以便在下次更新時將它們全部刪除?感謝幫助! – emotality

1

你目前只存儲一個標誌,但要添加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 
+0

您好,感謝您的回答,但得到警告標誌:「集合表達式類型‘GMSMarker *’可不迴應‘countByEnumeratingWithState:對象:伯爵:’」 ......想這意味着它不能循環,如果它只是1個對象也許? – emotality

+0

這意味着我錯過了一個S地方,或者它意味着你抄錯了;)...的錯誤說你嘗試過含0-N GMSMarkers數組不是枚舉在GMSMarker,顯然是行不通的。 –

+0

self.googleMapDriverPins = self.googleMapsDriverPins :)(順便說一句:我寫它內嵌的過程所以當然可以是錯別字) –

1

在基於引腳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; 
} 

}

0

在斯威夫特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) 
    } 

您可以設置用戶數據屬性,以任何你想要的,後來使用該字符串刪除的「從」從map.Let刪除marker.When的了funcName功能被執行,所有標記與用戶數據我知道你是否有任何疑問。