添加注释以从另一个视图映射
Posted
技术标签:
【中文标题】添加注释以从另一个视图映射【英文标题】:Add Annotation to map from another View 【发布时间】:2012-09-27 14:35:23 【问题描述】:我正在尝试从我的 AppDelegate 调用 plotParkingLots
,因为我希望在应用程序启动时首先调用它(然后每隔 x 秒调用一次,稍后我将实现)。
plotParkingLots
如果我通过 MapViewController 的viewDidLoad
调用它可以正常工作,但是当我从 AppDelegate 调用它时,它不起作用。
我知道它被调用了,但是当我切换到我的地图视图时,没有显示任何注释!
MapViewController.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#define METERS_PER_MILE 1609.344
@interface MapViewController : UIViewController <MKMapViewDelegate>
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
- (void)plotParkingLots;
@end
MapViewController.m
- (void)plotParkingLots
NSString *url = [NSString stringWithFormat:@"http:/localhost/testes/parking.json"];
NSData *jsonData = [NSData dataWithContentsOfURL: [NSURL URLWithString:url]];
if (jsonData == nil)
UIAlertView *alertBox = [[UIAlertView alloc] initWithTitle: @"Erro de conexão" message: @"Não foi possível retornar os dados dos estacionamentos" delegate: self cancelButtonTitle: @"Ok" otherButtonTitles: nil];
[alertBox show];
else
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
NSArray *parkings = [json objectForKey:@"parkings"];
for (NSDictionary * p in parkings)
Parking *annotation = [[Parking alloc] initWithDictionary:p];
[_mapView addAnnotation:annotation];
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
static NSString *identifier = @"Parking";
if ([annotation isKindOfClass:[Parking class]])
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView == nil)
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
else
annotationView.annotation = annotation;
annotationView.enabled = YES;
annotationView.canShowCallout = YES;
annotationView.image=[UIImage imageNamed:@"car.png"];
return annotationView;
return nil;
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
[[MapViewController alloc] plotParkingLots];
return YES;
【问题讨论】:
【参考方案1】:您不是在与向用户显示的 MapViewController 交谈。在您的 AppDelegate 中,您暂时分配一个 MapViewController,绘制停车场,然后放弃该 MapViewController 并且不再使用它。
您需要保留该控制器的句柄,以便当用户按下某些东西以使该视图控制器显示时,它与刚刚绘制停车场的那个相同。
【讨论】:
我明白你说的,但不知道该怎么做。我可以使用单例 MapViewController 吗?这会是一个好的解决方案吗? 您在哪里创建 MapViewController 以将其显示给用户?如果直到用户单击按钮才显示它,为什么要加载数据呢?他们甚至可能不会去那个屏幕。如果他们确实进入该屏幕,您必须创建一个 MapViewController 然后显示它。您可以在您的应用程序完成启动后获取数据,然后仅在您真正启动它时将其传递。以上是关于添加注释以从另一个视图映射的主要内容,如果未能解决你的问题,请参考以下文章