MKMapView不调用委托方法

时间:2009-09-04 13:42:42

标签: iphone mapkit

在UIViewController中,我将MKMapView添加到控制器控制的视图中。

- (void)viewDidLoad {
[super viewDidLoad];
CGRect rect = CGRectMake(0, 0, 460, 320);
map = [[MKMapView alloc] initWithFrame:rect];
map.delegate = self;
[self.view addSubview:map];
 }

稍后在控制器中我有

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
     NSLog(@"done.");
}

完成永不打印。其他任何委托方法都不像mapView一样调用:viewForAnnotation:我在另一个应用程序中使用MKMapView,但这似乎发生在我制作的任何新应用程序上。还有其他人看到过这种行为吗?

编辑:

问题似乎是当UIViewController成为MKMapView的委托时,NSObject的直接子类似乎工作正常。我可以像这样解决这个问题,因为我之前已经做过,所以看起来仍然很奇怪。

9 个答案:

答案 0 :(得分:9)

我遇到了完全相同的问题:我已经分配了< MKMapViewDeledate>到我的控制器,并将委托链接到Interface Builder中的“文件所有者”,但仍然没有调用我实现的委托方法。

原因是,自iOS 4以来,地图被缓存,每当应用程序显示缓存的地图时,都不会调用诸如“mapViewDidFinishLoadingMap”之类的方法。重置模拟器中的“内容和设置”会清除缓存的地图,从而解决问题。

答案 1 :(得分:6)

有点旧,但是从iOS 7开始,有一种新方法可行。解决了我的问题

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered

答案 2 :(得分:4)

也许您需要转到IB并控制 - 从MKMapView拖动到视图控制器,然后选择委托使其成为委托???

答案 3 :(得分:1)

可能很明显,但只是检查:

您是否确保正确完成了viewcontroller声明。 类似的东西:

@interface YourViewController : UIViewController <MKMapViewDelegate>

答案 4 :(得分:1)

我有一个类似的问题,没有调用MKMapViewDelegate的方法。 我的问题是在控制器的-viewDidLoad()中设置MKCoordinateRegionMakeWithDistance和regionThatFits我想只显示我家周围的区域而不是从世界视图开始。因此,在控制器的viewDidLoad中添加注释后,我启动了一个计时器。当它在一秒钟内到期时,我会使用上述API放大我想要的区域,并触发委托方法。它让我有点晕,倾向于在我的iPad上呕吐。

现在我只需要处理低内存警告。

答案 5 :(得分:0)

我刚刚在iOS 7上遇到了这个问题,并找到了一致的功能。我们通常要解决的问题是在区域具有上下文(视图呈现)之前调用setRegion。 iOS 7添加了新的委托方法,表示正在渲染的所有图块,但在iOS 7之前,缓存的图块会阻止调用委托方法mapViewDidFinishLoadingMap。相反,我使用“pendingRegion”变量来检查我是否在渲染地图时“排队”了一个区域更改,然后简单地使用viewDidAppear方法作为地图已渲染到屏幕的信号,因此一个区域将具有上下文

向标题添加变量:

MKCoordinateRegion pendingRegion;

将此方法添加到您的代码中:

-(void)initPendingRegion {
    pendingRegion.center = CLLocationCoordinate2DMake(0.0, 0.0);
}

将此添加到viewDidAppear:

if(pendingRegion.center.latitude != 0.0) {
        MKCoordinateRegion useRegion = pendingRegion;
        [self initPendingRegion];
        [self.mapView setRegion:useRegion animated:YES];
}

答案 6 :(得分:0)

我在iOS 8.1的XCode 6.1构建中遇到了类似的问题,其中没有调用任何MKMapViewDelegate方法。在第二个应用程序中,相同的代码导致按预期调用MKMapViewDelegate方法。

在ViewController.m中,mapView委托的设置如下:

- (void)viewDidLoad {
    ...
    self.mapView.delegate = self;

在ViewController.h中:

@interface myMapViewController : UIViewController <MKMapViewDelegate>
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@end

我手动将上面的IBOutlet行添加到头文件中,但仅限于未收到委托方法的应用程序。

解决方案是删除我手动添加到标题的IBOutlet行,然后转到故事板并按CTRL-从MKMapView拖动到ViewController.h中的@interface块。在头文件中重新创建了相同的IBOutlet,结果是所有委托方法都被正确调用。

答案 7 :(得分:0)

我的问题是我忘了在模拟器中设置位置。转到Simulator -> Debug -> Location -> Custom location...MKMapViewDelegate方法将开始调用

答案 8 :(得分:-2)

我也遇到了和你一样的问题。我发现:使用iPhone SDK 3.2 - 当我创建一个带有相关xib文件的新UIViewController(UIViewController创建对话框中的复选框选项)时,从不调用MKMapViewDelegate的委托方法。

但是,当我按照以下步骤操作时,它运行良好。

  1. 创建一个新的UIViewController类(永远不要检查选项:创建与控制器关联的xib文件)

  2. 创建一个新的xib文件。使用Interface Builder添加地图+在第1步中将Owner类设置为类+将地图点的委托对象设置为所有者类。

  3. 在步骤1中为UIViewController类实现委托方法。

  4. 当我想使用我的ViewController(添加了地图)时,我使用nib名称加载它,如下例所示:

    MapPreviewController* mapPreviewController = [[MapPreviewController alloc] 
        initWithNibName:@"MapPreviewController" bundle:[NSBundle mainBundle]];
    
    [self.centerPanelView addSubview:mapPreviewController.view];
    
  5. 代码运行正常。当我使用向导创建UIViewController时,我不知道Apple更改或使用xib文件做了什么,但它可能是我的问题的根本原因。找到这个愚蠢的解决方案需要1天时间。

    如果您找到另一个,请与我分享。

    由于