проблема с MKMapView и контроллером навигации - PullRequest
0 голосов
/ 16 апреля 2010

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

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

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

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

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

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

objectMapVC.objectsToMap = self.object.childObjects;

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

[objectMapVC release];

Любая помощь с благодарностью!

Ответы [ 3 ]

1 голос
/ 05 октября 2010

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

0 голосов
/ 07 декабря 2011

Мне кажется, у меня была похожая проблема. После одного дня борьбы с контроллером навигации и 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 никогда не обновлялся по местоположению, хотя я прошел через него, чтобы убедиться, что он выполнен правильно и все значения действительно были правильно переданы в mapview.

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

В стороне CustomMapController перезаписать функцию

 -(void)viewWillLayoutSubviews

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

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

0 голосов
/ 21 апреля 2010

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

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

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

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

...