2013-07-28 101 views
0

我不明白爲什麼委託不發送該郵件的MapView:didUpdateUserLocation:委託方法送交

在viewDidLoad中我問的MapView與setShowUserLocation到startUpdating:YES。但它就像從來沒有完成過。

有什麼建議嗎?

#import "TrackViewController.h" 
#import "MainWindowViewController.h" 



@class MainWindowViewController; 
@implementation TrackViewController 

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    NSLog(@"Init trackcontriller"); 
    self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 

if(self){ 

    locationManager = [[CLLocationManager alloc]init]; 

    [locationManager setDelegate:self]; 

    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 


    } 
    return self; 
} 

-(IBAction) back:(id)sender{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

-(void) findLocation; 
{ 
    NSLog(@"findlocation"); 
    [locationManager startUpdatingLocation]; 

} 

-(void) foundLocation:(CLLocation *)loc 
{ 
    NSLog(@"Foundlocation"); 
    CLLocationCoordinate2D coord = [loc coordinate]; 

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coord, 100, 100); 
    [worldView setRegion:region animated:YES]; 


    [locationManager stopUpdatingLocation]; 
} 

-(void)viewDidLoad 
{ 
    NSLog(@"viewDidLoad"); 
    [worldView setShowsUserLocation:YES]; 
    [worldView setMapType:MKMapTypeHybrid]; 

} 

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    NSLog(@"mapview didupdateUserlocation"); 
    CLLocationCoordinate2D loc = [userLocation coordinate]; 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 200, 200); 
    [worldView setRegion:region animated:YES]; 
} 

-(void)dealloc 
{ 

    [locationManager setDelegate:nil]; 
} 

- (void) locationManager:(CLLocationManager *) manager 
didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation 
// Deprecated i know 
{ 
    NSLog(@"Locationanager didupdate tolocation from location"); 


NSTimeInterval t = [[newLocation timestamp] timeIntervalSinceNow]; 

if(t<-180){ 
    return; 
} 

    [self foundLocation:newLocation]; 
} 

-(void)locationManager:(CLLocationManager *)manager 
    didFailWithError:(NSError *)error 
{ 
    NSLog(@"Could not find location: %@", error); 
} 

@end 
+1

您是否將此類設置爲地圖視圖的代表? – rdelmar

回答

0

我想你混淆的CLLocationManagerMapView位置服務。 mapView:didUpdateUserLocation:MKMapView的代表方法。如果您只需要此方法來更新用戶的位置,則不必實例化CLLocationManager。相反,你簡單地說,像你一樣,[worldView setShowsUserLocation:YES];
不過,當然,你的對象實現mapView:didUpdateUserLocation:必須是你委託MKMapView對象,這裏的worldView,不是一個CLLocationManager對象!
所以我的建議是將您的TrackViewController對象設置爲MKMapView對象的代理,即worldView,並刪除與CLLocationManager相關的代碼。

+0

我在xib中設置了mapView的委託。不要混淆CLLocationManager和MapView是有道理的。它的奇怪 - 雖然這個代碼幾乎是從Big Nerd Ranch IOS編程版本3複製的。如果它不正確,他們爲什麼會混淆它。就像現在這樣,locationManager根本沒有用處? – Anders

+0

您的代碼使用CLLocationManager來定期更新mapView的區域。使用MKMapView的跟蹤模式選項可以更輕鬆地完成相同的操作。無論如何,當您的代碼找到新位置時,它會停止使用核心位置服務的位置管理器。但是這些也被MKMapView使用。我不確定,但可能是停止位置管理器也會停止更新用戶位置的mapView,並且不再調用mapView:didUpdateUserLocation:。你可以發表評論[locationManager stopUpdatingLocation];並檢查回調是否通過。 –

+0

順便說一句我假設worldView是一個保留/強大的屬性,所以它不會被釋放之前,它可以做回調? –