Я видел, как это происходит, когда я поворачиваю экран, на котором есть UITableView
. Я узнал, что это происходит между вызовами метода willRotate
и didRotate
в UIViewController
Мои коллеги видели его и в других местах, обычно вокруг вращения. Он не начинал происходить до недавнего времени, и мы были в тупике относительно того, как мы должны с этим справиться (поисковые запросы Google не отображают сообщение об ошибке в его точной форме). Кто-нибудь еще столкнулся с этим, кто знает, что с этим делать?
Что вызывает эту ошибку? "Позиция CALayer содержит NaN: [240 nan]"
Ответ 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-стиля.