代码之家  ›  专栏  ›  技术社区  ›  Steve McLeod

在什么情况下,[nsscreen mainscreen]visibleframe]会返回空值?

  •  2
  • Steve McLeod  · 技术社区  · 15 年前

    我想得到主屏幕的尺寸,所以我使用以下代码段:

    NSLog(@"mainScreen frame = %@", [[NSScreen mainScreen] visibleFrame]);
    

    它的印刷

    mainScreen frame = (null)
    

    早些时候,它正在打印我的主显示器的预期尺寸。

    可能的原因是什么?

    4 回复  |  直到 9 年前
        1
  •  9
  •   danielpunkass    15 年前

    这里的问题是,您遇到的是Objective-C Cocoa编程中相对较少的非对象之一。

    “可见帧”的结果是一个NSECT 结构 ,不是对象。要使其在nslog行中有意义地显示,必须执行以下操作:

    NSString* frameAsString = NSStringFromRect([[NSScreen mainScreen] visibleFrame]);
    NSLog(@"mainScreen frame = %@", frameAsString);
    

    有一些帮助函数可以将这些结构对象中的许多转换为字符串并返回,例如nsStringFromPoint、nsStringFromRange等。

        2
  •  2
  •   Mark    15 年前

    有关这方面的文档需要仔细阅读。苹果公司定义的“主屏幕”不一定是带有菜单栏的屏幕。“主屏幕”是接收键盘事件的屏幕。如果出于某种原因,操作系统认为没有屏幕具有键盘焦点,那么我可以理解为什么主屏幕会返回空值。

    要使用菜单栏(和原点(0,0))获取屏幕,需要使用:

    [[NSScreen screens] objectAtIndex:0]
    

    我从来没有见过这个返回值为空,尽管我不会说它不会发生。

        3
  •  1
  •   Marc Charbonneau    15 年前

    -visibleframe在为对象使用字符串说明符时返回一个nsretc结构。您需要使用nsStringFromRect()函数(我相信它被调用)将rect转换为nslog()的字符串对象。

        4
  •  0
  •   applehelpwriter    9 年前

    您试图记录一个对象,但方法没有返回一个对象,而是返回一个结构。

    尽管nsstringfromrect将帮助您进行日志记录,但您可能需要其他地方的实际整数。

    您可以通过以下两种方式实现这两个目标:

    NSLog(@"screen is %.2f wide and %.2f high", [[[NSScreen screens]     
    objectAtIndex:0] visibleFrame].size.width,  [[[NSScreen screens] 
    objectAtIndex:0] visibleFrame].size.height);