2014-09-04 86 views
1

想象的痕跡演示這是一個應用程序,用於跟蹤用戶的移動路徑,以適用於iOS 7 https://developer.apple.com/library/ios/samplecode/Breadcrumb/Introduction/Intro.html獲取位置更新中的多個視圖控制器

必要的更新但現在,我想有一個第二視圖控制器(TrackOnMapViewController),它有一個MapView,我可以從第一個BreadCrumb在自己的MapView上顯示用戶路徑的導航(通過push segue,比方說)到TrackOnMapViewController。我知道第二種觀點顯示與第一種觀點相同的東西是沒有意義的,但這不是我問題的重點。所以現在,第一個視圖控制器實現了

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

並在其中更新第一個視圖控制器的MapView上的覆蓋。

我實現了Segue公司如下:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString: @"showMap"]) 
    { 
     TrackOnMapViewController *tomvc = (TrackOnMapViewController *)segue.destinationViewController; 
     tomvc.crumbs = self.crumbs; 
    } 
} 

所以一旦我原因請看TrackOnMapViewController,在viewDidLoad中我有

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (self.crumbs) 
    { 

     [self updatePathTravelled:self.crumbs]; 

     [self.mapView addOverlay:self.crumbs]; 
     MKCoordinateRegion region = 
     MKCoordinateRegionMakeWithDistance(MKCoordinateForMapPoint(self.crumbs.points[0]), 400, 400); 
     [self.mapView setRegion:region animated:YES]; 
    } 
} 

而且也是我實現:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    if (!self.crumbView) 
    { 
     _crumbView = [[CrumbPathView alloc] initWithOverlay:overlay]; 
    } 
    return self.crumbView; 
} 

在TrackOnMapViewController。

因此,該應用程序工作正常,在第一個視圖控制器中,用戶的路徑在MapView上進行跟蹤,當我繼續TrackOnMapViewController時,我看到路徑,但問題是路徑無法在TrackOnMapViewController中更新(我知道,因爲沒有代碼來更新路徑)。所以我的問題是,什麼是最好的方式來更新TrackOnMapViewController中的路徑。我無法想象答案是在第二個視圖控制器中執行

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

。我想我應該在第一個視圖控制器執行位置更新時以某種方式執行此更新。或者可能將位置更新移到其他位置,並在多個視圖控制器中使用更新。但我不確定如何做到這些,如果他們是正確的方法。詳細的答案將不勝感激。謝謝!

+1

我找工作的最好的位置的東西是有一個單身是「大腦」,所以在任何地方你的應用程序,你可以說[[MyLocationManager sharedInstance] lastLocation];並且該單例實現了所有的CLLocationManager邏輯。 – Mike 2014-09-04 05:02:35

回答

0

那麼,我結束瞭如下使用NSNotificationCenter。我喜歡這個解決方案,比Mike在他的評論中提出的要好一點,即使用Singleton。

所以在原來的ViewController我加

NSDictionary* userInfo = @{@"Crumbs": self.crumbs}; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"CrumbPathGotUpdated" object:self userInfo: userInfo]; 

self.crumbs後右邊有一個更新的價值。而在TrackOnMapViewController,在viewDidLoad中我加

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(CrumbPathUpdated:) name:@"CrumbPathGotUpdated" object:nil]; 

和方法

- (void) CrumbPathUpdated:(NSNotification *) notification 
{ 
    NSDictionary* userInfo = notification.userInfo; 
    CrumbPath *crumbs = (CrumbPath *)userInfo[@"Crumbs"]; 
    [self updatePathTravelled:crumbs]; 
}