2010-11-29 2 views
13

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

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) 

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

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

+0

Это связано с тем, что фрейм - это cgrect, который является структурой, а не классом? – Chris 2010-11-29 11:17:02

ответ

50

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

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

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

И так далее. Поэтому, выводя CGRect в виде строки становится супер-легкий:

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

Вы можете найти все эти вспомогательные методы here под

4

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

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

10

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

NSLog(@"%@",[NSValue valueWithCGRect:textView.frame]); 
-1

В Swift это просто «Струнные Конверсии.»:

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

Вопрос о Objective-C, а не Swift. – JasonMArcher 2014-11-27 18:08:13