10

在 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 的直接子类似乎可以正常工作。我可以像这样工作,因为我以前做过,所以看起来仍然很奇怪。

4

10 回答 10

9

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

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

于 2011-01-15T18:06:50.697 回答
7

有点旧,但从 iOS 7 开始,有一种新方法可能会起作用。解决了我的问题

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
于 2015-06-14T22:48:47.760 回答
4

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

于 2010-01-28T23:59:01.783 回答
1

也许很明显,但只是检查:

您是否确保正确完成了视图控制器声明。就像是:

@interface YourViewController : UIViewController <MKMapViewDelegate>
于 2009-09-04T15:02:19.747 回答
1

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

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

于 2010-05-21T15:38:57.637 回答
1

我在为 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,结果是所有委托方法都被正确调用。

于 2015-03-01T06:55:03.140 回答
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];
}
于 2013-09-26T15:26:35.237 回答
0

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

于 2017-04-04T09:19:44.357 回答
-1

NSLocationWhenInUseUsageDescription对我来说,在 Info.plist 中添加字符串后它起作用了

于 2015-05-03T12:12:50.827 回答
-2

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

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

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

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

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

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

    MapPreviewController* mapPreviewController = [[MapPreviewController alloc] 
        initWithNibName:@"MapPreviewController" bundle:[NSBundle mainBundle]];
    
    [self.centerPanelView addSubview:mapPreviewController.view];
    

代码运行正常。当我使用向导创建 UIViewController 时,我不知道 Apple 对 xib 文件进行了哪些更改或做了什么,但这可能是我的问题的根本原因。我花了 1 天时间才找到这个愚蠢的解决方案。

如果你找到了另一个,请分享给我。

谢谢

于 2010-05-02T10:09:34.637 回答