Что вызывает эту ошибку? "Позиция CALayer содержит NaN: [240 nan]" - программирование
Подтвердить что ты не робот

Что вызывает эту ошибку? "Позиция CALayer содержит NaN: [240 nan]"

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

XCode 3.x

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

XCode 4.x

  • CMD-6 (навигатор точек останова.)
  • "+", чтобы добавить точку останова (внизу слева).
  • Выберите ADD SYMBOLIC BREAKPOINT.
  • Символ: NSLog
  • Подтверждение: выполнено.

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

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

Ответ 3

Я потратил целый день, пытаясь найти код, который вызывает такую ​​же проблему, и решил его в течение минут после включения "break on exception" в Xcode. Проверьте этот учебник, чтобы узнать, как его включить.

Ответ 4

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

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, затем вызов команды return.

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

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

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

Ответ 5

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

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-стиля.