Quelles sont les causes de cette erreur? "La position de CALayer contient nan: [240 nan]"

Je l'ai vu se produire chaque fois que je tourne un écran qui a un UITableView. J'ai découvert que ça se passe entre les willRotate et didRotate les appels de méthode dans UIViewController Mes collègues l'ont vu dans d'autres spots, habituellement autour de la rotation. Cela n'avait pas commencé avant très récemment, et nous sommes perplexes quant à la façon dont nous devrions traiter avec elle (les recherches google ne font pas apparaître le message d'erreur dans sa forme exacte). Quelqu'un d'autre a rencontré ce que ne sait pas quoi faire à ce sujet?

42
demandé sur pablasso 2010-06-11 22:15:18

7 réponses

(a Décidé de prendre de commentaires et de mettre comme une réponse, car je pense que c'est une sacrément bonne réponse :)

Ha! J'ai eu un calcul de NaN (div0), aussi. Aide de débogage clé: le message en question est produit par NSLog(), donc définissez un point de rupture sur NSLog() et regardez ce que le système D'exploitation fait à ce moment-là. Pour moi, c'était myUISlider.valeur = NaN.

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

XCode 3.x

  • CMD-SHIFT-Y (debug fenêtre.)
  • points d'arrêt bouton.
  • "Double-cliquez pour le symbole"
  • Tapez "NSLog" (no quotes.)

XCode 4.x

  • CMD-6 (points d'arrêt navigator.)
  • " + " pour ajouter le point de rupture (en bas à gauche).)
  • sélectionnez Ajouter un point de rupture symbolique.
  • Symbole: NSLog
  • Confirmer: Terminé.

XCode 5.x - 7.1 (au moins) (Même que 4.le navigateur est CMD-7, Maintenant.)

Exécuter l'application, regarder pause sur NSLog, vérifiez les traces de la pile.

35
répondu Olie 2015-09-24 00:48:04

j'ai trouvé le problème.

Lorsque vous réinitialisez le cadre d'un tableview, il appelle la méthode du délégué tableView:heightForRowAtIndexPath: pour chaque ligne du tableau afin qu'il puisse recalculer sa taille de contenu si nécessaire. À ce moment-là, nous faisons une manipulation spéciale pour retourner la hauteur, et en raison de quelques mauvaises hypothèses dans notre code, Nous sommes retournés par erreur NaN en raison d'une division par zéro erreur (la variable que nous divisons par a été supposée ne jamais être zéro). Nous assurer que nous ne nous divisons pas par zéro ici fixé il.

24
répondu Kevlar 2011-11-16 04:08:24

j'ai passé une journée à essayer de trouver le code qui cause le même problème et je l'ai résolu en quelques minutes après avoir activé "break on exception" dans Xcode. Vérifier ce tutoriel pour voir comment l'activer.

14
répondu azernitsky 2012-07-02 14:09:24

j'ai eu ce problème quand j'étais supposé que:

tableView:heightForHeaderInSection: a retourné une NSInteger, mais il renvoie CGFloat...

changer:

-(NSInteger)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

correction de mon problème.

Edit:

à un moment donné, j'ai compris comment les ordinateurs fonctionnent en dessous du niveau C, alors j'ai pensé que je pourrais le partager... (J'utiliserai les noms de registre de x86_64 comme je les connais le mieux, ARM serait légèrement différent mais analogue)

int f(){
          float someFloat=5.0f;
          return someFloat;
       }

permet de convertir la valeur de someFloat pour un type entier, puis de le copier à un registre particulier: %rax puis appeler l'instruction retour.

float f(){
          float someFloat=5.0f;
          return someFloat;
       }

permet de copier la valeur de someFloat à partir de son emplacement actuel vers un registre particulier: %xmm0 puis appeler l'instruction retour.

donc si vous avez le mauvais prototype le code d'appel s'attend à ce que la valeur soit au mauvais endroit, vous finirez par vraiment retourner une valeur d'ordures.

12
répondu Grady Player 2013-05-02 16:57:23

cette erreur m'a aussi coûté beaucoup de temps.

À 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 code comme celui-ci et de corriger le problème:

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

une certaine valeur de UIEdgeInsets n'est pas initialisée correctement, et elle se transforme parfois en une valeur NaN, et bloque l'application.

Plus généralement, vous devriez vérifier si toutes les valeurs des structures de style C sont initialisées correctement.

2
répondu Z.L.Chen 2014-03-06 06:16:36

il y a une autre façon de reproduire le problème: en utilisant insetBy(dx:dy:) sur un trop petite rect

enter image description here

0
répondu Tim 2018-01-11 12:06:05

Vous pouvez essayer ce yourTableview?.bounces = false. Il fonctionne pour moi.

0
répondu kalpesh 2018-03-13 13:34:09