Странное поведение с NSLog - PullRequest
       57

Странное поведение с NSLog

13 голосов
/ 29 ноября 2010

Я использую NSLog для проверки UITextView.В моем коде есть следующие операторы регистрации:

    NSLog(@"textView: %@",textView);
    NSLog(@"textView.frame: %@",textView.frame);
    NSLog(@"[textView frame]: %@",[textView frame]);

И при выводе на консоль я получаю следующее:

2010-11-29 22:00:38.252 MenuMaker[57602:207] textView: <UITextView: 0x3b3afe0; frame = (0 0; 320 387); text = 'blah...'; clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x3b3afa0>>
2010-11-29 22:00:38.254 MenuMaker[57602:207] textView.frame: (null)
2010-11-29 22:00:38.254 MenuMaker[57602:207] [textView frame]: (null)

Первая строка вывода, поскольку она содержитбит 'frame = (0 0; 320 387)' заставляет меня поверить, что переменная кадра UITextView настроена полностью.Но почему следующие две строки показывают ноль в этом случае?Разве они не должны сбрасывать значения фрейма?

Заранее спасибо

Ответы [ 5 ]

50 голосов
/ 29 ноября 2010

Как уже отмечали другие, CGRect - это просто структура, и поэтому в ней отсутствует метод -description (именно это статический метод + stringWithFormat для NSString, используемый NSLog, заменяет% @ на строку формата).Следовательно, вы не можете передать его в NSLog напрямую.

Однако нет необходимости выводить какие-либо значения по отдельности, как это предлагается.Какао предоставляет ряд встроенных методов, которые визуализируют несколько структур Core Graphics в строку:

NSStringFromCGRect()
NSStringFromCGPoint()
NSStringFromCGSize()
NSStringFromCGAffineTransform()

и так далее.Поэтому вывод CGRect в виде строки становится очень простым:

NSLog(@"%@", NSStringFromCGRect(rect));

Все эти вспомогательные методы можно найти здесь в разделе «Строковые преобразования».

10 голосов
/ 29 ноября 2010

Вы также можете сделать, как показано ниже

NSLog(@"%@",[NSValue valueWithCGRect:textView.frame]);
4 голосов
/ 29 ноября 2010

UIView.frame - это просто структура CGRect (которая в свою очередь содержит структуру CGPoint и CGSize).Таким образом, никакие классы не участвуют, и поскольку только классы могут иметь строковое представление, вы получаете отображение null.Что вы должны сделать, если хотите, чтобы значения кадра были примерно такими:

NSLog(@"textView.frame origin: %f %f", textView.frame.origin.x, textView.frame..origin.y);
NSLog(@"textView.frame size: %f %f", textView.frame.size.width, textView.frame.size.height);
3 голосов
/ 29 ноября 2010

TextView. frame вернет значение CGRect. Так что если вы хотите знать значения фрейма textView

NSLog(@"textView frame height: %f",textView.frame.size.height);
NSLog(@"textView frame width: %f",textView.frame.size.width);
NSLog(@"textView frame x Position: %f",textView.frame.origin.x);
NSLog(@"textView frame y Position: %f",textView.frame.origin.y);

NSLog будет считать это значение нулевым, если не распознает объект, который получил.

0 голосов
/ 24 ноября 2014

В Swift все просто:

println("\(textView.frame)")
...