Objective c 第一次调用toggleFullScreen:donds';不工作(过去是这样!)

Objective c 第一次调用toggleFullScreen:donds';不工作(过去是这样!),objective-c,xcode,cocoa,Objective C,Xcode,Cocoa,我有一个基于Xcode模板的基于文档的应用程序。它没有使用核心数据 我的应用程序非常简单: “文档”窗口在Interface Builder中为全屏采集行为设置了主窗口 切换全屏菜单项和窗口控件的工作方式与预期相同 在代码中,我使用以下命令调用toggleFullScreen: NSWindow * window = [NSApp mainWindow]; [window toggleFullScreen:self]; 定时器触发前一次,时间段结束后一次,恢复到非完整sceen模式 最近,

我有一个基于Xcode模板的基于文档的应用程序。它没有使用核心数据

我的应用程序非常简单:

  • “文档”窗口在Interface Builder中为全屏采集行为设置了主窗口
  • 切换全屏菜单项和窗口控件的工作方式与预期相同
在代码中,我使用以下命令调用toggleFullScreen:

NSWindow * window = [NSApp mainWindow];
[window toggleFullScreen:self];
定时器触发前一次,时间段结束后一次,恢复到非完整sceen模式

最近,它只是停止工作-第一个电话没有任何效果。我在第一次调用之前设置了一个断点,它只是执行而没有效果

我甚至为测试设置了一个NSWindowDelegate类,当用户使用菜单项或使用标准窗口控件手动切换full sreen时,它会响应windowDidEnterFullScreen:和windowDidExitFullScreen:

函数windowDidFailToEnterFullScreen:在delgate中,在第一次切换失败后,永远不会调用该函数

第二个调用(使用完全相同的代码))起作用-它将窗口带入全屏(而不是全屏,因为第一个调用不起作用)

有什么想法吗

令人沮丧的是,这曾经奏效!我有一个旧版本的应用程序,它可以做同样的事情,使用相同的代码,并且运行良好。这扼杀了我关于它与升级到El Capitan有关的理论

那么会发生什么呢?我一生都无法解决这个问题。我是否意外更改了interface builder中的某些内容?可能是我的项目/编译器设置

非常感谢任何帮助

问候,


约翰

你试过清理这个项目吗?同时清理项目生成文件夹。按cmd+shift+K,然后在Xcode中按cmd+shift+opt+K。然后重新构建项目。

您是否尝试过清理项目?同时清理项目生成文件夹。按cmd+shift+K,然后在Xcode中按cmd+shift+opt+K。然后重新构建这个项目。

好的,我在经历了很多痛苦之后终于破解了这个问题

问题是对toggleFullScreen的第一个调用:在用作NSAlert处理程序的块内调用

出于某种原因,现在需要在切换工作之前手动关闭NSAlert窗口

以下是我的解决方案:

- (IBAction) areYouSure:(NSButton *) sender {

    NSWindow *window = [NSApp mainWindow];


    // Ask the user if they are sure

    NSAlert * alert = [[NSAlert alloc] init];

    // .. set up NSAlert ..

    [alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse returnCode) {
        if (returnCode == NSAlertSecondButtonReturn)
        {        
            [[alert window] close]; // This line solved the problem!

            [window toggleFullScreen:self]; // Without above line, this does nothing.
        }
    }]; // end block
}
正如我在最初的帖子中所提到的,在我升级到El Capitan之前,这项功能一直有效,没有使用[[alert window]close]调用

因此,一定有什么改变了,尽管我找不到解释上述行为的任何文档

我以前版本的应用程序在另一个窗口上显示警报,在另一个窗口上调用了toggleFullScreen

我猜问题与以下事实有关:toggleFullScreen是在完成处理程序中调用的,而且调用与NSAlert连接到的同一个窗口上

在切换全屏工作之前,必须手动关闭NSAlert

希望这将有助于在未来的人

有人对这种行为有更多的信息吗?El Capitan的哪些变化可能导致这种情况

问候,


约翰

好吧,我在撕了很多头发后终于把它弄破了

问题是对toggleFullScreen的第一个调用:在用作NSAlert处理程序的块内调用

出于某种原因,现在需要在切换工作之前手动关闭NSAlert窗口

以下是我的解决方案:

- (IBAction) areYouSure:(NSButton *) sender {

    NSWindow *window = [NSApp mainWindow];


    // Ask the user if they are sure

    NSAlert * alert = [[NSAlert alloc] init];

    // .. set up NSAlert ..

    [alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse returnCode) {
        if (returnCode == NSAlertSecondButtonReturn)
        {        
            [[alert window] close]; // This line solved the problem!

            [window toggleFullScreen:self]; // Without above line, this does nothing.
        }
    }]; // end block
}
正如我在最初的帖子中所提到的,在我升级到El Capitan之前,这项功能一直有效,没有使用[[alert window]close]调用

因此,一定有什么改变了,尽管我找不到解释上述行为的任何文档

我以前版本的应用程序在另一个窗口上显示警报,在另一个窗口上调用了toggleFullScreen

我猜问题与以下事实有关:toggleFullScreen是在完成处理程序中调用的,而且调用与NSAlert连接到的同一个窗口上

在切换全屏工作之前,必须手动关闭NSAlert

希望这将有助于在未来的人

有人对这种行为有更多的信息吗?El Capitan的哪些变化可能导致这种情况

问候,


约翰

非常感谢。我刚刚尝试了这两种方法,但问题仍然存在。尽管您已经修复了问题(做得很好!),但仍然不需要警报窗口。也许现在会有其他人来解决这个问题!不确定你的意思-由于我的应用程序的设计方式,我需要用户在全屏显示之前确认是或否。这不是使用NSAlert的标准方式吗?是的,但在你的应用程序进入全屏之前,你仍然不应该要求用户确认。你应该能够在不使用NSAlert的情况下进入全屏。实际上,当用户单击按钮时,这是我的应用程序所期望的行为。这不是一个“典型”的应用程序。我意识到这不是标准行为。谢谢非常感谢。我刚刚尝试了这两种方法,但问题仍然存在。尽管您已经修复了问题(做得很好!),但仍然不需要警报窗口。也许现在会有其他人来解决这个问题!不确定你的意思-由于我的应用程序的设计方式,我需要用户在全屏显示之前确认是或否。这不是使用NSAlert的标准方式吗?是的,但在你的应用程序进入全屏之前,你仍然不应该要求用户确认。你应该能够在不使用NSAlert的情况下进入全屏。实际上,当用户单击按钮时,这是我的应用程序所期望的行为。这不是一个“典型”的应用程序。我意识到这不是标准行为。谢谢