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

Я использую 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 полностью настроена. Но почему в таком случае в следующих двух строках отображается null? Разве они не должны сбрасывать значения фрейма?

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


person Chris    schedule 29.11.2010    source источник
comment
Связано ли это с тем, что frame - это cgrect, который является структурой, а не классом?   -  person Chris    schedule 29.11.2010


Ответы (5)


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

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

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

И так далее. Следовательно, вывод CGRect в виде строки становится очень простым:

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

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

person Count Chocula    schedule 29.11.2010

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

NSLog(@"%@",[NSValue valueWithCGRect:textView.frame]);
person Iphone_bharat    schedule 29.11.2010

UIView.frame - это просто _ 2_ структура (которая, в свою очередь, содержит _ 3_ и _ 4_ struct). Таким образом, никакие классы не задействованы, и поскольку только классы могут иметь строковое представление, вы получаете отображение 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);
person slup    schedule 29.11.2010

текстовое представление. 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 будет считать это значение нулевым, если он не распознает полученный объект.

person ipraba    schedule 29.11.2010

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

println("\(textView.frame)")
person Segev    schedule 24.11.2014
comment
Вопрос касается Objective-C, а не Swift. - person JasonMArcher; 27.11.2014