проблема с MKMapView и навигационным контроллером

У меня есть UITableView (в стеке контроллера навигации), который показывает детали для пользовательского объекта модели. Объект имеет свойство массива для хранения дочерних объектов, каждый из которых имеет свойство широты и долготы.

Поскольку я «лениво загружаю» все из API веб-службы, массив дочерних объектов не заполняется до тех пор, пока пользователь не коснется ячейки в подробном представлении в первый раз, чтобы увидеть объекты на карте. На этом этапе я сначала создаю и отправляю промежуточный «загрузочный вид», который вызывает вызов API, заполняет массив, а затем создает и отправляет вид карты.

Проблема заключается в том, что когда представление на основе карты передается на навигационный контроллер, MKMapView не показывает. Заголовок панели навигации и кнопка «Назад» меняются правильно, но я все еще вижу предыдущее представление загрузки между панелью вкладок приложений и панелью навигации! Если массив был ранее заполнен, я помещаю представление на основе карты сразу после подробного представления, и оно работает нормально. Я также использую этот контроллер представления карты в своем проекте без каких-либо проблем.

Я не могу понять, что здесь происходит. Если я изменю контроллер представления «загрузка», чтобы отображать представление карты в модальном режиме, он также будет работать нормально. Ниб контроллеров представления карты использовался двумя пользовательскими классами контроллеров, и я сначала подумал, что это проблема, но теперь владелец файлов в IB настроен на правильный контроллер.

Вот код из представления загрузки, который подталкивает представление карты:

ObjectMapViewController *objectMapVC = [[ObjectMapViewController alloc] 
                initWithNibName:@"ObjectLocationView" bundle:nil];

objectMapVC.objectsToMap = self.object.childObjects;

[self.navigationController pushViewController:objectMapVC animated:YES];

[objectMapVC release];

Любая помощь очень ценится!


person thomh    schedule 16.04.2010    source источник


Ответы (3)


Наиболее вероятной причиной этой проблемы является то, что вы запускали загрузку в фоновом потоке. Если в том же потоке вы показываете/настраиваете свой MapView, это может быть проблемой. Все действия пользовательского интерфейса должны выполняться в основном потоке. Это объясняет, почему с помощью PerformSelector afteDelay проблема решена.

person gonso    schedule 04.10.2010

Исправлено это, заключив приведенный выше код в отдельный метод и вызвав его с помощью

[self performSelector:@selector(pushMapView) withObject:nil afterDelay:0.3];

после завершения вызова API.

Я предполагаю, что у навигационного контроллера не было достаточно времени, чтобы правильно настроить стек представления, поскольку вызов API обычно занимает менее секунды, поэтому представление карты выдвигалось почти сразу после анимации загрузки представления.

person thomh    schedule 20.04.2010

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

CustomMapController*mapController=[[[CustomMapController alloc]init] autorelease];
mapController.delegate=self;
mapController.view.userInteractionEnabled=YES;
UINavigationController*navController=[[[UINavigationController alloc]initWithRootViewController:mapController] autorelease];

[(UIViewController*)[self.view.superview nextResponder] presentModalViewController:navController animated:YES];
[mapController loadGPSMapWithlongitude:longitudeString andLatitude:latitudeString];

В функции loadGPSMapWithlongitude область карты устанавливается и перерисовывается вызовом

[mapView setRegion:region animated:YES]; and 
[mapView regionThatFits:region];

Проблема, с которой я столкнулся, заключалась в том, что mapView внутри mapController никогда не обновлялся по местоположению, хотя я прошел через него, чтобы убедиться, что он выполнен правильно, и все значения действительно правильно переданы в представление карты.

Вот мое решение:

Внутри CustomMapController перезапишите функцию

 -(void)viewWillLayoutSubviews

и выполняет обновление карты [mapView setRegion:self.region анимированный:YES]; [mapView regionThatFits:region];

Итак, в функции loadGPDMapWithLongitude:: я просто передал местоположение в self.region. По очень странной причине отображение карты внутри UINavigationController + ModalView должно следовать этой последовательности кода. В остальном у меня никогда не было проблем.

person Wayne Lo    schedule 07.12.2011