Objective-C for Dummies:如何使App Delegate与控制器通信?

时间:2011-03-21 01:19:37

标签: iphone objective-c core-location

如何从app delegate中调用控制器中的方法。例如,我的应用程序使用app delegate来监视用户的位置。确定位置后,我想在控制器上调用一个方法,该控制器上有一个MKMapView并显示用户的位置。我怎么能这样做?

这是我目前的代码:

//  AppDelegate.m
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [[[DashboardViewController alloc] initWithNibName:@"DashboardViewController" bundle:nil] displayMyLocation:newLocation.coordinate];
}

还试过这个,它与SIGABRT崩溃,但至少试图调用该方法:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [(DashboardViewController *)dashboardViewController displayMyLocation:manager];
}

或者,现在我考虑一下,让控制器监视用户的位置并自己调用它的方法是不是错了?如果我记得正确拥有多个CLLocationManagerDelegate委托并不影响性能,因为它们都以相同的方式访问GPS?这是对还是错?拥有同样事物的多个实例似乎有点蠢......

提前致谢!

@nevan更新

地图代码:

- (void)displayMyLocation:(CLLocation *)location {
    MKCoordinateSpan span;
    MKCoordinateRegion region;

    span.latitudeDelta = 0.02;
    span.longitudeDelta = 0.02;

    region.center = location.coordinate;
    region.span = span;

    [map setRegion:region];
}

2 个答案:

答案 0 :(得分:2)

让控制器监控位置事件肯定是个好主意。

一个相当不错的选择是使用通知中心通知控制器新的位置可用。我实际上在我的一个应用程序中做到了这一点。 Check out line 70 of this file to see how to send a notificationline 54 of this file to see how tp subscribe tp these notifications

答案 1 :(得分:1)

多次调用

locationManager:didUpdateToLocation,每次设备在该位置获得新的修复,因此您最终会多次分配和启动DashboardViewController。执行此操作的正确方法是在设置应用程序委托时分配和初始化dashboardViewController实例变量,然后使用该实例变量。看起来你已经在第二段代码中完成了这项工作,但我不明白为什么你必须将它转换为DashboardViewController。

将位置管理器放在与mapview相同的位置会更好。为什么不将locationManager:didUpdateToLocation移到那里?