添加注释以从另一个视图映射

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 然后显示它。您可以在您的应用程序完成启动后获取数据,然后仅在您真正启动它时将其传递。

以上是关于添加注释以从另一个视图映射的主要内容,如果未能解决你的问题,请参考以下文章

从另一个方法将子视图添加到子视图

从另一个视图重新加载表视图

我可以从另一个视图中调用一个视图吗?

从另一个视图控制器添加单元格时 UITableViewCell 的内容不可见

从另一台计算机或手机添加数据后,如何更新计算机上的视图?

Cakephp 从另一个视图中检索 id