代码之家  ›  专栏  ›  技术社区  ›  Chris

使用NSLog的奇怪行为

  •  13
  • Chris  · 技术社区  · 14 年前

    我正在使用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的frame变量已经设置好了。但在这种情况下,为什么后面两行显示为空?难道他们不应该丢弃帧的值吗?

    提前谢谢

    5 回复  |  直到 10 年前
        1
  •  50
  •   Count Chocula    14 年前

    正如其他人所指出的,CGRect只是一个结构,因此,它缺少一个-description方法(这就是nslogused的nsstringwithformat静态方法用in-format字符串替换了%@的方法)。因此,不能直接传递给NSLog。

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

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

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

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

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

        2
  •  10
  •   Iphone_bharat    14 年前

    你也可以像下面这样

    NSLog(@"%@",[NSValue valueWithCGRect:textView.frame]);
    
        3
  •  4
  •   slup    14 年前

    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);
    
        4
  •  3
  •   ipraba    14 年前

    文本视图。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无法识别接收到的对象时,它会将该值视为null。

        5
  •  -1
  •   Segev    10 年前

    在Swift中很简单:

    println("\(textView.frame)")