在什么情况下[[NSScreen mainScreen] visibleFrame]会返回null?

时间:2009-05-14 15:51:39

标签: objective-c cocoa

我想获得主屏幕的尺寸,所以我使用这个片段:

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

正在打印

mainScreen frame = (null)

之前它正在打印主显示器的预期尺寸。

有什么可能的原因?

4 个答案:

答案 0 :(得分:9)

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

“visibleFrame”的结果是NSRect 结构,而不是对象。要使它在NSLog行中有意义地显示,您必须执行以下操作:

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

有一些辅助函数可以将许多这些结构对象转换为字符串并返回,例如NSStringFromPoint,NSStringFromRange等

答案 1 :(得分:2)

需要仔细阅读有关此文档的文档。 Apple定义的“主屏幕”不一定是菜单栏的屏幕。 “主屏幕”是接收键盘事件的屏幕。如果由于某种原因操作系统认为没有屏幕具有键盘焦点,那么我就能理解为什么mainScreen会返回NULL。

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

[[NSScreen screens] objectAtIndex:0]

我从未见过这个返回NULL,虽然我不会说它不可能发生。

答案 2 :(得分:1)

-visibleFrame返回一个NSRect结构,而您正在为对象使用字符串说明符。您需要使用NSStringFromRect()函数(我相信它被调用)将rect转换为NSLog()的字符串对象。

答案 3 :(得分:0)

你试图记录一个对象,但该方法没有返回一个对象,它返回一个结构。

虽然NSStringFromRect可以帮助您进行日志记录,但您可能希望其他地方有实际的整数。

您可以通过以下方式完成这两项:

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