在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的直接子类似乎工作正常。我可以像这样解决这个问题,因为我之前已经做过,所以看起来仍然很奇怪。
答案 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的委托方法。
但是,当我按照以下步骤操作时,它运行良好。
创建一个新的UIViewController类(永远不要检查选项:创建与控制器关联的xib文件)
创建一个新的xib文件。使用Interface Builder添加地图+在第1步中将Owner类设置为类+将地图点的委托对象设置为所有者类。
在步骤1中为UIViewController类实现委托方法。
当我想使用我的ViewController(添加了地图)时,我使用nib名称加载它,如下例所示:
MapPreviewController* mapPreviewController = [[MapPreviewController alloc]
initWithNibName:@"MapPreviewController" bundle:[NSBundle mainBundle]];
[self.centerPanelView addSubview:mapPreviewController.view];
代码运行正常。当我使用向导创建UIViewController时,我不知道Apple更改或使用xib文件做了什么,但它可能是我的问题的根本原因。找到这个愚蠢的解决方案需要1天时间。
如果您找到另一个,请与我分享。
由于