2012-01-10 2 views
2

Je suis nouveau dans iphone en utilisant MKMapView pour charger une carte de google dans mon application. Mais son lancement une exception "MKMapView doit être initialisé sur le thread principal.". Alors, où dois-je initialiser mon objet MKMapView. J'initialise dans viewDidLoad().MKMapView doit être initialisé sur le thread principal

merci à l'avance .....

+0

que vous devriez vraiment fourni plus de détails ... – Vladimir

Répondre

3

La raison pour laquelle il est de ne pas être crée sur le thread principal est l'une des 2 options

  1. La vue qui crée elle vit sur l'un des arrière-plan discussions
  2. Vous appelez performSelectorInBackground: pour créer votre point de vue

pour exécuter une fonction sur l'appel de thread principal performSelectorOnMainThread:

Hors-sujet: Si la fonction nécessite plus de 1 paramètre, changer à un NSDictionary et charger tous vos paramètres dans le dictionnaire et le transmettre par exemple, dans

NSDictionary *params = ...... //load your parameters into here 

[myMapView performSelectorOnMainThread:@selector(initMap:) 
           withObject:params 
          waitUntilDone:YES]; 

Lisez également les éléments suivants First et Second Pour mieux comprendre le multithreading dans iOS

+0

J'utilise le code suivant dans viewDidLoad et ce point de vue est appelé par une autre vue Mapview = [[MKMapView alloc] initWithFrame: CGRectMake (0,0,780,920)]; mapView.delegate = self; [self.view addSubview: mapView]; [NSThread detachNewThreadSelector: @selector (displayMyMap) toTarget: self avecObjet: nil]; – user1141020

+0

Vous créez un nouveau thread en faisant cela, essayez de changer à performSelectorOnMainThread au lieu de detachNewThreadSelector – CStreel

+0

merci pour votre suggestion, mais je suis toujours confronté au même problème – user1141020

0

Avec Swift 3, les fonctions suivantes garantissent que votre fonction s'exécute sur le thread principal. OperationQueue.main.addOperation { "votre Segue ou appel de fonction"}

+1

Bienvenue à SO. S'il vous plaît envelopper votre code avec des guillemets afin qu'il soit affiché comme code. – YakovL

0

J'ai eu cette erreur:

MKMapView must be initialized on the main thread

Quand j'ai essayé de changer le contenu d'un UITableViewCell personnalisé de cette façon:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:@[myIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

The UITableviewCell in the corresponding indexpath contained a MKMapView that I tried to change its region. 

myTabelViewCell *cell = [self.tableView cellForRowAtIndexPath:myIndexPath]; 
[cell setContentWithLatitude:currentLatitude longitude:currentLongitude]; 

Utilisez le code ci-dessus au lieu de [self.tableView reloadData] pour actualiser une seule cellule.

Questions connexes