2010-11-29 28 views
13

J'utilise NSLog pour inspecter un UITextView. Je les déclarations de journalisation suivantes dans mon code: i obtenir les éléments suivantsComportement étrange avec NSLog

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

Et dans la sortie de la console,:

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 première ligne de sortie, car il contient le « cadre = (0 0; 320 387) 'bit, m'amène à croire que la variable frame de UITextView est toute mise en place. Mais pourquoi les deux lignes suivantes montrent null dans ce cas? Ne devraient-ils pas vider les valeurs du cadre?

Merci à l'avance

+0

Est-ce que cela a quelque chose à voir avec le fait que frame est un cgrect qui est une structure et non une classe? – Chris

Répondre

50

Comme les autres l'ont noté, CGRect est juste un struct et, par conséquent, manque une méthode -description (qui est ce que la méthode statique + stringWithFormat de NSString-utilisé par NSLog-remplace% @ avec dans une chaîne de format). Par conséquent, vous ne pouvez pas le transmettre directement à NSLog.

Cependant, il n'est pas nécessaire de sortir l'une des valeurs individuellement comme suggéré. Cocoa fournit un certain nombre de méthodes intégrées qui rendent plusieurs structures Core Graphics à une chaîne:

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

Et ainsi de suite. Par conséquent, la sortie d'un CGRect sous la forme d'une chaîne devient très facile:

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

Vous pouvez trouver toutes ces méthodes d'aide here sous

4

UIView.frame est juste un struct CGRect (qui à son tour contient une CGPoint et un struct CGSize). Donc, aucune classe n'est impliquée, et comme seules les classes peuvent avoir une représentation sous forme de chaîne, vous obtenez null. Ce que vous devez faire si vous voulez que les valeurs de la trame est quelque chose comme ceci:

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 retournera une valeur CGRect. Donc, si vous voulez connaître les valeurs de cadre d'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 considérera cette valeur comme nulle quand il ne marche pas reconnaître l'objet ce que le Recieved.

10

Vous pouvez aussi faire comme ci-dessous

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

Dans Swift, il est simple « conversions de chaînes. »:

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

La question concerne l'objectif C, pas Swift. – JasonMArcher