在多个视图控制器中获取位置更新

时间:2014-09-04 04:09:53

标签: ios objective-c cllocationmanager mkoverlay

想象一下BreadCrumb演示,这是一款用于跟踪用户旅行路径的应用,以及iOS 7的必要更新。https://developer.apple.com/library/ios/samplecode/Breadcrumb/Introduction/Intro.html

但是现在,我正在尝试第二个视图控制器(TrackOnMapViewController),其中包含一个MapView,我可以从第一个看到用户路径的TrackOnMapViewController导航(通过推送segue,比方说)它自己的MapView。我知道有一个第二个视图显示与第一个视图相同的东西是没有意义的,但这不是我的问题的重点。所以现在,第一个View Controller实现了

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

并在其中更新第一个View Controller的MapView上的Overlay。

我实施了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 个答案:

答案 0 :(得分: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];
}