ios - 将 MainViewController 设置为 MKMapView 的委托(delegate)时不会出现注释

标签 ios delegates mkmapview mkannotation

我正在处理一个奇怪的问题……我有一个非常基本的 mkmapview,我将其拖到 mainviewcontrollers View 中。我在 map 上显示了非常基本的注释。当我使 mainviewcontroller 成为 mapview 的委托(delegate)(在 IB 或代码中)时,注释停止显示。如果我不建立这种联系,注释会按预期出现……有什么想法吗?

#import "GDFlipsideViewController.h"
#import <MapKit/MapKit.h>

@interface GDMainViewController : UIViewController <MKMapViewDelegate>

@property (strong, nonatomic) IBOutlet UIToolbar *bottomToolbar;
@property (strong, nonatomic) IBOutlet MKMapView *theMap;
@property (strong, nonatomic) MKLocalSearchResponse *results;
@property (strong, nonatomic) MKLocalSearchRequest *request;
@property (strong, nonatomic) MKLocalSearch *search;

- (IBAction)locateHelp:(UIBarButtonItem *)sender;

@end
...

@implementation GDMainViewController
...
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    static NSString *AnnotationViewID = @"annotationViewID";
    GDHelpAnnotationView *annotationView = (GDHelpAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

    if (annotationView == nil){
        annotationView = [[GDHelpAnnotationView alloc]init];

    }

    annotationView.annotation = annotation;

    return annotationView;
}

...

- (IBAction)locateHelp:(UIBarButtonItem *)sender {

    [self searchForHelp];
}

..

- (void)searchForHelp {
    // drop pins for emergency destination
    [self searchForFireStations];
    [self searchForPoliceStations];
    [self searchForHospitals];

}

...

- (void)searchForFireStations {
    //Fire stations
    [_request setNaturalLanguageQuery:@"fire station"];
    [_request setRegion:[_theMap region]];
    _search = [[MKLocalSearch alloc]initWithRequest:_request];

    [_search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
        if ([response.mapItems count] == 0) {
            if ([response.mapItems count] == 0) {
                //will handle later
                return;
            }
        }

        [response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop) {
            GDHelpAnnotation  *annotation = [[GDHelpAnnotation alloc] initWithPlacemark:item.placemark];
            annotation.title = item.name;
            annotation.subtitle = [item name];

            [_theMap addAnnotation:annotation]; // This gets called but doesnt show annotations when self is _theMap's delegate
        }];



    }];
}

最佳答案

如果 viewForAnnotation 在您设置委托(delegate)时被调用,但引脚没有出现,则故障可能出在 GDHelpAnnotationView 上。您可以通过将 viewForAnnotation 替换为使用常规旧 MKPinAnnotationView 的更基本的 View 来测试这一点。

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
    static NSString *AnnotationViewID = @"annotationViewID";
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
    if (annotationView == nil)
    {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
    } else {            
        annotationView.annotation = annotation;
    }
    return annotationView;
}

关于ios - 将 MainViewController 设置为 MKMapView 的委托(delegate)时不会出现注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104420/

相关文章:

ios - iOS中Swift如何使用CGColorCreate变白

iOS 集成照片应用

iOS 8 永远运行应用程序或禁用屏幕

iphone - map View 崩溃时的 GDirections 路线

ios - 如何清除mkmapview的缓存

ios - 保持 iOS 6 和 iOS 7 支持的最佳方法是什么?

c# - ASP.NET 委托(delegate)和表达式 - 信息请求

swift - 协议(protocol)方法不会在另一个 View Controller 中执行

java - 拆分类后避免耦合

ios - 扩展 MKPolylines 或创建多个 MKPolylines?