NSLog的奇怪行为

时间:2010-11-29 11:09:23

标签: ios objective-c cocoa-touch uitextview 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?他们不应该抛弃框架的价值吗?

提前致谢

5 个答案:

答案 0 :(得分:50)

正如其他人所说,CGRect只是一个结构,因此缺少一个-description方法(这是NSLog使用的NSString的+ stringWithFormat静态方法 - 用格式字符串替换%@)。因此,您无法直接将其传递给NSLog。

但是,不需要像建议的那样单独输出任何值。 Cocoa提供了许多内置方法,可以将多个Core Graphics结构呈现为字符串:

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

等等。因此,以字符串形式输出CGRect变得非常容易:

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

您可以在“字符串转换”下找到所有这些辅助方法here

答案 1 :(得分:10)

你也可以这样做

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

答案 2 :(得分:4)

UIView.frame只是一个CGRect结构(它依次包含CGPointCGSize结构。 因此不涉及任何类,并且因为只有类可以具有字符串表示,所以显示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 :(得分: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不识别对象所收到的内容时,NSLog会将该值视为null。

答案 4 :(得分:-1)

在Swift中很简单:

println("\(textView.frame)")