我目前正在OS X中开发一个应用程序,只是尝试将应用程序设置为全屏。我做了一些研究,发现我需要调用sharedApplication
方法中的applicationDidFinishLaunching
对象中的函数。
[[NSApplication sharedApplication] setPresentationOptions:NSApplicationPresentationFullScreen];
但是,在运行应用程序时,我会将此消息记录给我。
setPresentationOptions called with NSApplicationPresentationFullScreen when there is no visible fullscreen window; this call will be ignored.
我无法找到解决方案,有人可以解释我如何解决这个问题吗? 这是我从消息中理解的,如果我的窗口首先不是全屏,我无法将我的应用程序设置为全屏,这对我来说没有意义,因为我需要有一个较小的窗口供我随后想要最大化。发生了什么事?
更新1: 这是重新创建的错误的视频链接。 Please do watch this它的长度为4分钟。
答案 0 :(得分:4)
好的,我希望这是一个有用的答案。
首先,我将讨论iOS和Mac之间的基本应用程序开发差异,并将继续讨论如何使用NSWindowController,然后尝试解释为什么你所做的事情会导致意外行为!
因此在Mac开发中有趣的事情(我也来自iOS开发)是在AppKit中没有相同的函数调用UIApplicationMain
;就是有一个函数NSApplicationMain
;但是他们的签名是不同的。在iOS中,您可以为要使用的应用指定UIApplication
子类和UIApplicationDelegate
类,但在Mac中,您无法指定NSApplication
子类和NSApplicationDelegate
类。有了这个说法,可能会混淆AppDelegate
的工作原理,或者如何使用自定义NSApplication
。首先在Info.plist
中有一个键NSPrincipalClass
,它告诉系统应用NSApplication
的哪个子类。不幸的是,代表并不是那么简单。 Info.plist
还有另一个键NSMainNibFile
,它告诉系统最初使用的是哪个nib。它以应用程序作为所有者加载此nib并自动添加一些默认连接:
AppDelegate
(或PREFIXAppDelegate
)。所以这里nib将自动分配其中一个类并将委托连接分配给文件所有者,从而在NSApplication
上设置委托。NSFontManager
。它为菜单项添加了一些连接,这与选择字体的系统UX保持一致。那么为什么要使用笔尖?我个人来自iOS,正如我所提到的,并且个人并不是一直喜欢笔尖。在代码中完成所有操作时,事情变得更加灵活。在Mac应用程序中,我不觉得你在使用笔尖时失去了灵活性。 Nib通常是创建mac应用程序的标准(据我所知)(并且标准通常存在是有原因的)。此外,创建Mac应用程序的一个相当重要的方面是设置加载笔尖的NSMainNibFile
键!
如果现在你按照" ya ya,但仍然,nibs,ew!"然后我会试着在这里指导你。一个快速的警告,已经有一段时间了,因为我已尝试以编程方式执行此操作,因此某些信息可能会出现偏差!有了这个说,让我们潜入它!
至少我相信你可以逃脱只是将NSPrincipalClass
中的Info.plist
密钥设置为自定义子类。然后在该子类中重写-init
*以将NSApplication
的委托设置为自定义委托类。在这里,您的代理将正常工作,您的应用程序应按预期运行(因此不需要笔尖)。另请注意,您可以简单地将NSApplication
子类化,并将其自身设置为它自己的委托(来自设计POV有点奇怪)或者不设置委托并仅覆盖某些方法(在某些情况下调用超)。不是一起使用委托,而是可以实例化一个通知监听器对象,它只是监听NSApplicationDidFinishLaunchingNotification
之类的通知等。
窗口控制器本质上是一个窗口应用程序的基类(确定可以反过来说,但这是一个非常好的起点)。如您所知,您只是将NSWindowController子类化,然后分配它的一个实例并调用-showWindow:
。
正如文档所述,你不需要一个笔尖来处理NSWindowController,但是"窗口控制器和nib文件之间的关系很重要" (引自文档)。您只需创建一个以NSWindowController
作为所有者的笔尖,然后添加一个窗口对象并将所有者的窗口属性指定为所述窗口并且您可以继续(请注意设置代理窗口给主人也是一个非常好的主意 - 可能是必要的!)!当然,如果你检查"自动为我创建笔尖"创建子类时的复选框将为您创建此笔尖。
Apple的医生基本上说"使用它,它就像电;你不必使用它,但使用"非常好。
所以你想成为阿米什? (恶意的笑话,对不起)。 Anywho,要以编程方式创建其中一个,首先需要对其进行子类化,然后手动设置窗口属性(可能在-init
中)或在调用函数/方法中。
当您删除MainMenu.nib
时,您删除了对该委托的引用。因此,您的委托从未被分配,因此永远不会调用委托消息。这就是您的窗口永远不会出现的原因 - 您的代码永远不会被调用。如果你删除了nib里面的窗口对象但保留了其余的连接,那么代码/应该/工作(我刚刚测试过,然后我再次对模板进行一些调整,这样我的测试可能不准确)。
创建window controller来电-showWindow:
然后[windowController.window toggleFullscreen:nil]
。这应该导致窗口全屏(再次测试并适合我)。
所以你最后一个问题是关于重新创建(IMO很棒的)应用程序。我个人手头上没有很好的教程可以创建一个平面mac应用程序,但是我已经了解了一些一般的原则:
-drawRect:
方法来填充该颜色(注意这不是& #39; t / only /,这将我们带到下一点。)-setWantsLayer:YES
,以便打开图层。根据我的经验,只需在子类中从YES
返回- (BOOL)wantsLayer
即可,您需要实际发送消息。如果您对带有图层的子类NSView感兴趣,请查看- (BOOL)wantsUpdateLayer
,告知系统在重新绘制视图时调用- (void)updateLayer
而不是- (void)drawrect:(NSRect)r
。编辑:添加了一些链接。一般来说,对于Mac开发,请不要忘记阅读this!
*我记得在10.7 / 8中这样做但未尝试在10.9中进行此操作
请注意:如果您在这篇文章中发现错误(因为我很长时间以来我假设我说了些傻话),请尊敬地在下面纠正我。我鼓励更正,但我希望他们尊重!