2011-09-12 98 views
0

我正在用下面的代碼獲得無限循環。當用戶點擊「getDirections」方法按鈕時,警報正確啓動。當從警報按鈕中選擇「Get Drections」時,Google地圖可以完美地工作。當他們重新打開應用程序時,它會打開回這個視圖,應用程序立即返回到Google地圖,重新運行該方法。只有這樣,我才能阻止這種情況,就是讓「應用程序不在後臺運行」轉爲YES,這是我不想做的。CLLocationManager運行循環

有人可以告訴我爲什麼會發生這種情況嗎?

-(IBAction)getDirections 
{ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Directions" message:@"Do you want driving directions?" delegate:self cancelButtonTitle:@"No Thanks" otherButtonTitles:@"Get Directions", nil]; 
    [alert show]; 
    [alert release]; 
} 

-(void)showDirections 
{ 
    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 
    [locationManager setDelegate:self]; 

    [locationManager startUpdatingLocation]; 
} 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    CLLocationCoordinate2D coord = [newLocation coordinate]; 
    NSArray *array = [dataHold objectForKey:@"Subtree"]; 
    NSString *latitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:4]]; 
    NSString *longitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:5]]; 
    double clubLatitude = [latitude doubleValue]; 
    double clubLongitude = [longitude doubleValue]; 
    urlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f", coord.latitude, coord.longitude, clubLatitude, clubLongitude]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
     buttonString = [alertView buttonTitleAtIndex:buttonIndex]; 
     if([buttonString isEqualToString:@"Get Directions"]) 
     { 
      [self showDirections]; 
      buttonString = nil; 
     } 
     else if([buttonString isEqualToString:@"No Thanks"]) 
     { 
      nil; 
     } 
} 

回答

2

您錯過了以下代碼段。你應該把它添加到 (無效)的LocationManager:(CLLocationManager *)經理didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation方法

[locationManager stopUpdatingLocation]; 
2

didUpdateToLocation委託方法,一旦你CCLL CLLocationManager startUpdatingLocatoin的不斷呼籲。

因此,每次更新位置時都會調用您的代碼didUpdateToLocation - 即使您從後臺啓動應用程序。 該方法被稱爲很多,取決於您的locationManager的distanceFilter屬性。您可以通過將NSLog語句添加到委託方法來確認這一點,並查看它被調用的次數。

的文檔上的方法:這種方法的

討論實現是可選的。但是,您應該使用此方法 。

在將此消息發送給您的代理人時,新的 位置數據也可直接從CLLocationManager 對象獲得。 newLocation參數可能包含先前使用位置服務時緩存的數據。您可以使用位置對象的 timestamp屬性來確定 位置數據的最近時間。

遵循該指南並在didUpdateToLocation方法內保存timeStamp(或任何其他類型的標識符)。

一旦你設置了timeStamp,你可以使用這些值顯示谷歌地圖。旁註:您的CLLocationManager有一個屬性location,每次調用didUpdateToLocation時都會獲取更新 - 因此您可以依賴該屬性來獲取代碼中其他位置的當前位置。

HTH

+0

沙哈里亞爾,因爲我只需要一個didUpdateToLocation,我叫stopUpdatingLocation在didUpdateToLocation方法的末尾。工作很好。非常感謝! – Eric