2010-04-16 5 views
0

J'ai un UITableView (sur une pile de contrôleur de navigation) qui montre les détails d'un objet de modèle personnalisé. L'objet possède une propriété tableau pour contenir des objets enfants ayant chacun une propriété de latitude et de longitude. Comme je charge tout à partir d'une API de service Web, le tableau d'objets enfants n'est pas rempli jusqu'à ce que l'utilisateur appuie sur une cellule dans la vue détaillée pour voir les objets sur une carte. À ce stade, je crée d'abord et j'appuie sur une «vue de chargement» intermédiaire qui fait l'appel api, remplit le tableau puis crée et pousse la vue de la carte.Problème avec MKMapView et le contrôleur de navigation

Le problème est une fois que la vue basée sur la carte est poussée sur le contrôleur de navigation que MKMapView ne montre pas. Le titre de la barre de navigation et le bouton de retour changent correctement, mais je peux toujours voir la vue de chargement précédente entre la barre d'onglet des applications et la barre de navigation! Si le tableau a été précédemment rempli, je pousse la vue basée sur la carte directement après la vue détaillée et cela fonctionne correctement. J'utilise également ce contrôleur de vue de carte à travers mon projet sans problèmes précédents.

Je ne peux pas pour la vie de moi obtenir ce qui se passe ici. Si je change le contrôleur de vue de «chargement» pour présenter la carte-vue modalement alors cela fonctionne également bien. La nib des contrôleurs de vue de carte était utilisée par deux classes de contrôleurs personnalisées et j'ai tout d'abord pensé que c'était le problème - mais le propriétaire des fichiers dans IB est maintenant réglé sur le bon contrôleur.

est ici le code de la vue de chargement qui pousse la vue de la carte:

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

objectMapVC.objectsToMap = self.object.childObjects; 

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

[objectMapVC release]; 

Toute aide grandement appréciée!

Répondre

0

fixe ce en enveloppant le code ci-dessus dans une méthode séparée et téléphoner avec

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

une fois l'appel API complète. Je suppose que le contrôleur de navigation n'a pas eu assez de temps pour configurer correctement sa pile de vues car l'appel de l'API prend généralement moins d'une seconde pour que la vue de carte soit poussée presque dès que la vue de chargement animé dans.

1

La raison la plus probable de ce problème est que vous exécutez votre téléchargement dans un fil d'arrière-plan. Si dans le même thread vous affichez/configurez votre MapView, cela pourrait poser un problème. Toutes les actions de l'interface utilisateur doivent s'exécuter sur le thread principal. Cela expliquerait pourquoi le performSelector afteDelay a résolu le problème.

0

Je crois que j'ai eu un problème similaire. Après avoir lutté avec le contrôleur de navigation et MKMapView pendant un jour, j'ai finalement trouvé une solution. Voici mon code

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]; 

Dans la fonction loadGPSMapWithlongitude, la région de la carte est définie et redessinée en appelant

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

La question que j'avais été que le Mapview intérieur du mapController jamais être mis à jour par le emplacement même si je l'ai traversé pour s'assurer qu'il a été exécuté correctement et toutes les valeurs ont bien été transmises correctement à mapview.

Voici ma solution:

Dans le côté CustomMapController, remplacer la fonction

-(void)viewWillLayoutSubviews 

et exécute la carte updtae [Mapview setRegion: self.region animé: OUI]; [mapView regionThatFits: region];

Donc, dans loadGPDMapWithLongitude :: function, je viens de passer l'emplacement à self.region. Pour une raison très étrange, mapview à l'intérieur d'un UINavigationController + ModalView doit suivre cette séquence de code. Je n'ai jamais eu de problème autrement.

Questions connexes