web-dev-qa-db-fra.com

Qu'est-ce qui cause cette erreur? "La position de la couche contient NaN: [240 nan]"

J'ai vu cela se produire chaque fois que je fais pivoter un écran comportant une UITableView. J'ai découvert que cela se passait entre les appels de méthodes willRotate et didRotate dans UIViewController Mes collègues l'ont également vu à d'autres endroits, généralement autour de la rotation. Cela ne s'était pas produit depuis très récemment et nous ne savons pas comment nous en occuper (les recherches sur Google n'affichent pas le message d'erreur dans sa forme exacte). Quelqu'un at-il rencontré cela qui sait quoi faire à ce sujet?

44
Kevlar

J'ai trouvé le problème.

Lorsque vous réinitialisez le cadre d'une tableview, il appelle la méthode déléguée tableView:heightForRowAtIndexPath: pour chaque ligne du tableau afin qu'il puisse recalculer la taille de son contenu s'il le souhaite. À ce stade, nous effectuons des manipulations spéciales pour renvoyer la hauteur et, en raison de mauvaises hypothèses dans notre code, nous avons renvoyé par erreur NaN en raison d'une erreur division par zéro (la variable par laquelle nous divisons était supposée ne jamais être nulle). S'assurer que nous ne divisons pas par zéro ici l'a corrigé.

25
Kevlar

(Décidé de prendre cela en commentaire et de le mettre comme réponse, car je pense que c'est une bonne réponse bien méritée :)

Ha! J'ai eu un calcul de NaN (div0), aussi. Aide essentielle au débogage: le message en question est sorti par NSLog (), définissez donc un point d'arrêt sur NSLog () et observez ce que le système d'exploitation fait à ce moment-là. Pour moi, c’était myUISlider.value = NaN.

Pour définir un point d'arrêt:

XCode 3.x

  • CMD-SHIFT-Y (fenêtre de débogage.)
  • Bouton Points d'arrêt.
  • "Double-cliquez pour symbole" 
  • Tapez "NSLog" (sans guillemets.)

XCode 4.x

  • CMD-6 (navigateur des points d'arrêt).
  • "+" pour ajouter un point d'arrêt (en bas à gauche.)
  • Sélectionnez ADD SYMBOLIC BREAKPOINT.
  • Symbole: NSLog
  • Confirmer: Terminé.

XCode 5.x - 7.1 (au moins) (Identique à 4.x, sauf que le navigateur de points d'arrêt est CMD-7, maintenant.)

Lancez l'application, regardez-la sur NSLog, vérifiez les traces de la pile.

35
Olie

J'ai passé une journée à essayer de trouver le code qui cause le même problème et à le résoudre quelques minutes après l'activation de "l'interruption sur exception" dans Xcode. Vérifiez ce tutoriel pour voir comment l'activer.

15
azernitsky

Cette erreur m'a aussi coûté longtemps.
À la fin, j'ai trouvé mon collègue a écrit quelque chose comme ceci: 

UIEdgeInsets a;
a.left = (...some calculation);
button.imageEdgeInsets = a;

Et j'ai réécrit ces codes comme ceci et corrige le problème: 

UIEdgeInsets a;
a.left = (...some calculation);
a.top = 0;
a.bottom = 0;
a.right = 0;
button.imageEdgeInsets = a;

certaines valeurs de UIEdgeInsets ne sont pas initialisées correctement et se transforment parfois en une valeur NaN et font planter l’application.
Plus généralement, vous devriez vérifier si toutes les valeurs des structures de style C sont correctement initialisées.

2
Z.L.Chen

Il existe un autre moyen de reproduire le problème: utiliser insetBy(dx:dy:) sur un recto trop petit

 enter image description here

0
Tim

Vous pouvez essayer ce yourTableview?.bounces = false. Ça marche pour moi.

0
kalpesh