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 день, чтобы найти это глупое решение.
Если вы нашли еще один, пожалуйста, поделитесь со мной.
Спасибо