MKMapView не вызывает методы делегирования

В 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 в другом приложении, но это похоже на любое новое приложение, которое я делаю. Кто-нибудь еще видел это поведение?

EDIT:

Проблема заключается в том, что UIViewController становится делегатом MKMapView, прямой подкласс NSObject, похоже, работает нормально. Я могу обойти это так, все еще кажется очень странным, так как я делал это раньше.

Ответ 1

У меня была такая же проблема: я назначил <MKMapViewDeledate> к моему контроллеру и связал делегата с "владельцем файла" в Interface Builder, но все же мои реализованные методы делегатов не вызывались.

Причина в том, что с iOS 4 карты кэшируются, и всякий раз, когда приложение отображает кэшированную карту, такие методы, как mapViewDidFinishLoadingMap, не вызываются. Сброс "содержимого и настроек" в симуляторе очищает кэшированные карты и, следовательно, решает проблему.

Ответ 2

Немного устарел, но с iOS 7 существует новый метод, который может работать. решил мою проблему

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

Ответ 3

Возможно, вам нужно перейти в IB и перетащить управление из MKMapView в обработчик вида, а затем выбрать делегат, чтобы сделать его делегатом.

Ответ 4

может быть довольно очевидным, но просто проверка:

Вы убедились, что ваше объявление viewcontroller правильно сделано. Что-то вроде:

@interface YourViewController : UIViewController <MKMapViewDelegate>

Ответ 5

У меня была аналогичная проблема с тем, что методы MKMapViewDelegate не вызываются. Моя проблема заключалась в настройке MKCoordinateRegionMakeWithDistance и regionThatFits в контроллере -viewDidLoad(), который я хотел показывать только область вокруг моего дома, а не начинать с мировоззрения. Поэтому после добавления аннотаций в контроллер viewDidLoad я запустил таймер. Когда он истечет через одну секунду, я увеличиваю область, в которой я хочу, с указанными выше API-интерфейсами, и методы делегата запускаются. Это просто заставляет меня немного головокружение и склонна рвать на моем iPad.

Теперь мне нужно иметь дело только с предупреждениями о низкой памяти.

Ответ 6

Я снова столкнулся с этим на iOS 7 и понял, что работает последовательно. Проблема, с которой мы обычно сталкиваемся, вызывает setRegion до того, как область имеет контекст (view rendered). iOS 7 добавляет новые методы делегатов, представляющие все отображаемые фрагменты, но pre-iOS 7, кешированные плитки препятствуют вызову метода делегата mapViewDidFinishLoadingMap. Вместо этого я использую переменную "pendingRegion", чтобы проверить, был ли я "поставлен в очередь" на изменение области для отображения карты, а затем просто использовал метод viewDidAppear в качестве сигнала, который карта отобразила на экране, и, следовательно, регион будет иметь контекст.

Добавьте переменную в свой заголовок:

MKCoordinateRegion pendingRegion;

Добавьте этот метод в свой код:

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

Добавьте это к своему видуDidAppear:

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

Ответ 7

У меня была аналогичная проблема в XCode 6.1 для iOS 8.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 в блок @interface в моем ViewController.h. Идентичный IBOutlet был воссоздан в файле заголовка, в результате все методы делегатов были вызваны правильно.

Ответ 8

Моя проблема в том, что я забываю установить местоположение в симуляторе. Перейдите к Simulator -> Debug -> Location -> Custom location..., и методы MKMapViewDelegate начнут вызывать

Ответ 9

Для меня это сработало после добавления строки NSLocationWhenInUseUsageDescription в Info.plist

Ответ 10

Я также встретил ту же проблему, что и ваша. Я обнаружил, что: с iPhone SDK 3.2 - когда я создаю новый UIViewController с ассоциированным xib файлом (флажок в диалоговом окне создания UIViewController), делегатские методы MKMapViewDelegate никогда не вызываются.

Однако, когда я следую ниже, он работает хорошо.

  • Создайте новый класс UIViewController (никогда не проверяйте параметр: создайте файл xib, связанный с контроллером)

  • Создайте новый xib файл. Добавьте карту с помощью Interface Builder +, чтобы установить класс Owner с классом на шаге 1 +, чтобы задать объект делегирования точки карты классу владельца.

  • Внедрить методы делегатов для класса UIViewController на шаге 1.

  • Когда я хочу использовать свой ViewController (с добавленной картой), я загружаю его с именем nib, как показано ниже:

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

Код работает нормально. Я не знаю, что Apple изменила или сделала с файлом xib, когда я создаю свой UIViewController с помощью мастера, но это может быть основной причиной моей проблемы. Мне нужно 1 день, чтобы найти это глупое решение.

Если вы нашли еще один, пожалуйста, поделитесь со мной.

Спасибо