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?
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.
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.
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.
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.
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.
il y a une autre façon de reproduire le problème: en utilisant insetBy(dx:dy:)
sur un trop petite rect
Vous pouvez essayer ce yourTableview?.bounces = false
. Il fonctionne pour moi.