2010-11-29 27 views
13

Estoy usando NSLog para inspeccionar una UITextView. Tengo las siguientes declaraciones de registro en mi código:Comportamiento extraño con NSLog

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

Y en la salida de la consola, me sale el siguiente:

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) 

La primera línea de salida, ya que contiene el 'frame = (0 0; 320 387) 'bit, me lleva a creer que la variable de cuadro de UITextView está todo configurado. Pero, ¿por qué las dos líneas siguientes muestran nulo en ese caso? ¿No deberían volcar los valores del marco?

Gracias de antemano

+0

¿Tiene esto algo que ver con el hecho de que frame es un cctct que es una estructura, no una clase? – Chris

Respuesta

50

Como los otros han señalado, CGRect es sólo una estructura y, por tanto, carece de un método -Descripción (que es el que utiliza-NSString el método estático + stringWithFormat de por NSLog-reemplaza% @ con una cadena de formato). Por lo tanto, no puede pasarlo a NSLog directamente.

Sin embargo, no hay necesidad de generar ninguno de los valores individualmente como se sugiere. El cacao proporciona una serie de métodos integrados que hacen varias estructuras de núcleo de gráficos en una cadena:

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

y así sucesivamente. Por lo tanto, la salida de una CGRect en forma de una cadena se convierte en súper fácil:

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

Usted puede encontrar todos estos métodos auxiliares here bajo

4

UIView.frame es sólo un CGRect estructura (que a su vez contiene un CGPoint y una estructura CGSize). Así que no hay clases involucradas, y como solo las clases pueden tener una representación de cadena, se mostrará null. Lo que debe hacer si desea los valores del marco es algo como esto:

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. marco devolverá un valor de CGRect. Así que si quieres conocer los valores del marco de un 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 tendrá en cuenta ese valor como nulo cuando es imposible reconocer el objeto lo que la recibimos.

10

También se puede hacer, como a continuación

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

En Swift es simple “la conversión de series.”:

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

La pregunta es sobre Objective-C, no Swift. – JasonMArcher