Quelles sont les causes de cette erreur? “CALayer position contient NaN: [240 nan]”
J'ai vu cela se produire chaque fois que je tourne un écran qui a une UITableView
sur elle. J'ai trouvé qu'il 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. Il hadnt a commencé jusqu'à très récemment, et nous sommes perplexes quant à la façon dont nous devrions traiter avec elle (recherches google de ne pas faire tourner le message d'erreur dans sa forme exacte). Quelqu'un d'autre a rencontré ce que ne sait pas quoi faire à ce sujet?
Vous devez vous connecter pour publier un commentaire.
(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 NaN de calcul (div0), trop. Clé de débogage de l'aide: le message en question est sortie par NSLog(), afin de définir un point d'arrêt sur NSLog() et de regarder ce que l'OS est en train de faire à l'époque. Pour moi, c'était myUISlider.valeur = NaN.
Définir un point d'arrêt:
XCode 3.x
XCode 4.x
XCode 5.x - 7.1 (au moins)
(Même 4.x, à l'exception des points d'arrêt navigator est CMD-7, maintenant.)
Run app, regarder pause sur NSLog, vérifiez les traces de la pile.
CALayer position contains NaN
appelé à disparaître comme unNSException
. Configuration d'un point d'arrêt Exception: Toutes les Exceptions m'a donné la trace de la pile. (Symbolique point d'arrêt:NSLog
n'a pas.)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 de la table de sorte qu'il peut recalculer sa la taille du contenu, si il en a besoin. À ce point, nous faisons un peu particulières de manipulation pour revenir à la hauteur, et en raison de certaines des hypothèses erronées dans notre code, nous avons par erreur renvoyéNaN
en raison d'une erreur de division par zéro (la variable de nous diviser en était supposé ne jamais être égal à zéro). Nous nous assurons de ne pas diviser par zéro ici, il fixe.J'ai passé une journée à essayer de trouver le code qui provoque même problème et résolu à l'intérieur d'une minutes après l'activation de la "pause " exception" dans Xcode. Vérifier ce tutoriel de voir comment l'activer.
Exception Breakpoint
et laissez les paramètres par défaut. Cliquez sur Terminé et ré-exécutez votre application.J'ai eu ce problème quand j'étais supposé que:
tableView:heightForHeaderInSection:
renvoyé unNSInteger
, mais il renvoieCGFloat
...en train de changer:
à
fixé mon problème.
Edit:
À un certain moment, j'ai compris comment les ordinateurs fonctionnent en dessous du niveau C, donc j'ai pensé que je voudrais partager... (je vais utiliser un registre de noms de x86_64 que je suis plus familier avec eux, BRAS serait légèrement différente, mais analogue)
résultats dans la conversion de la valeur de
someFloat
à un type entier, puis de le copier à un registre particulier:%rax
, puis l'appel de l'instruction de retour.résultats en copiant la valeur de
someFloat
à partir de son emplacement actuel vers un registre particulier:%xmm0
, puis l'appel de l'instruction de retour.Donc, si vous avez la mauvaise prototype le code appelant vont s'attendre à ce que la valeur d'être au mauvais endroit, vous aurez vraiment de retourner une valeur d'ordures.
Cette erreur m'a coûté une longue période de temps.
À la fin, j'ai trouvé mon collègue a écrit quelque chose comme ceci:
Et j'ai réécrit ces code comme celui-ci et de corriger le problème:
une certaine valeur de UIEdgeInsets n'est pas initialisée correctement, et parfois se transformer en une valeur NaN, et le plantage de l'application.
Plus généralement, vous devriez vérifier si toutes les valeurs de C-style structures sont initialisées correctement.
Il y a un autre moyen de reproduire le problème: l'utilisation de
insetBy(dx:dy:)
sur un trop petite rectVous pouvez essayer ce
yourTableview?.bounces = false
. Il fonctionne pour moi.