Что вызывает эту ошибку? «Положение CALayer содержит NaN: [240 нм]» - PullRequest
46 голосов
/ 11 июня 2010

Я видел, как это происходило всякий раз, когда я поворачивал экран с UITableView. Я обнаружил, что это происходит между вызовами методов willRotate и didRotate в UIViewController Мои коллеги видели это и в других местах, обычно вокруг вращения. Это не происходило до недавнего времени, и мы озадачены тем, как мы должны с этим бороться (поиски в Google не показывают сообщение об ошибке в его точной форме). Кто-нибудь еще сталкивался с этим, кто знает, что с этим делать?

Ответы [ 7 ]

36 голосов
/ 13 июля 2010

(решил вычеркнуть это из комментариев и поставить в качестве ответа, так как я думаю, что это чертовски хороший ответ:)

Ха! У меня тоже был расчет NaN (div0). Помощь при отладке ключа: рассматриваемое сообщение выводится NSLog (), поэтому установите точку останова на NSLog () и посмотрите, что операционная система делает в это время. Для меня это было myUISlider.value = NaN.

Чтобы установить точку останова:

XCode 3.x

  • CMD-SHIFT-Y (окно отладки.)
  • Кнопка точек останова.
  • «Двойной щелчок для символа»
  • Введите "NSLog" (без кавычек).

XCode 4.x

  • CMD-6 (навигатор точек останова.)
  • «+» для добавления точки останова (внизу слева).
  • Выберите ДОБАВИТЬ СИМВОЛИЧЕСКУЮ ТОЧКУ ОТКЛЮЧЕНИЯ.
  • Символ: NSLog
  • Подтвердить: Готово.

XCode 5.x - 7.1 (как минимум) (То же, что и 4.x, за исключением того, что навигатор точек останова теперь CMD-7.)

Запустите приложение, посмотрите, как оно сломалось в NSLog, проверьте трассировку стека.

26 голосов
/ 19 июня 2010

Я нашел проблему.

Когда вы сбрасываете кадр tableview, он вызывает метод делегата tableView:heightForRowAtIndexPath: для каждой строки в таблице, чтобы он мог пересчитать размер его содержимого, если оннуждается в.В этот момент мы делаем некоторую специальную обработку для возврата высоты, и из-за некоторых неверных допущений в нашем коде мы по ошибке вернули NaN из-за ошибки деления на ноль (переменная, на которую мы делим, считалась никогда не равной нулю),Убедившись, что мы не делим на ноль, здесь это исправили.

15 голосов
/ 02 июля 2012

Я потратил день, пытаясь найти код, который вызывает ту же проблему, и решил ее в течение нескольких минут после включения в Xcode «исключения по исключению».Проверьте этот учебник , чтобы увидеть, как его включить.

12 голосов
/ 28 января 2011

У меня была эта проблема, когда предполагалось, что:

tableView:heightForHeaderInSection: вернул NSInteger, но возвращает CGFloat ...

изменение:

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

до

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

исправил мою проблему.

Edit:

В какой-то момент я выяснил, как компьютеры работают ниже уровня C, поэтому я решил поделиться им ... (Я буду использовать имена регистров из x86_64, поскольку я наиболее знаком с ними, ARM будет немного отличаться, но аналогичный)

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

приводит к преобразованию значения someFloat в целочисленный тип, затем копирует его в определенный регистр: %rax, затем вызывает инструкцию возврата.

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

приводит к копированию значения someFloat из его текущего местоположения в определенный регистр: %xmm0, затем вызывая инструкцию возврата.

Так что, если у вас неправильный прототип, вызывающий код будет ожидать, что значение будет в неправильном месте, в итоге вы действительно вернете значение мусора.

2 голосов
/ 06 марта 2014

Эта ошибка также стоила мне много времени.
В конце я обнаружил, что мой коллега написал что-то вроде этого:

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

И я переписал этот код следующим образом и исправил проблему:

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

некоторое значение UIEdgeInsets не инициализируется должным образом, и иногда оно превращается в значение NaN и приводит к сбою приложения.
В более общем случае вам следует проверить, все ли значения структур в стиле C инициализированы правильно.

0 голосов
/ 13 марта 2018

Вы можете попробовать это yourTableview?.bounces = false.У меня это работает.

0 голосов
/ 11 января 2018

Существует еще один способ воспроизвести проблему: использование insetBy(dx:dy:) на слишком маленьком прямоугольнике

enter image description here

...