从完成块开始动画后,模态NSSavePanel消失了

问题描述

G'day!

注意:下面链接了最小示例。我将避免冗长的代码摘录,而是简要地说明问题。

我正在将旧的(但很小的)可可应用程序更新为当前的API。

一开始看起来很容易的地方之一:当用户尝试使用未保存的更改关闭应用程序窗口时,应用程序首先显示一个NSAlert,询问“是否保存您的东西?”。如果确认,将显示模式NSSavePanel。在原始代码中,它们分别通过以下方式打开:

beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:
beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo:

当前的Cocoa API使用完成块,因此更喜欢通过beginSheetModalForWindow:completionHandler:显示警报。因此,我将代码从didEndSelector移到了completionHandler。

不幸的是,模式NSSavePanel会创建动画,但是如果从NSAlert的完成区中显示出来,则会立即与应用程序主窗口一起消失。如果我将警报切换回didEndSelector,则可以基于选择器或按块完成显示NSSavePanel

Here's the NSAlert's completion block that forwards to the disappearing save panel.

我考虑过线程问题。所有这些都是在主线程上发生的。也许我缺少运行循环模式下发生的细微变化?

最小示例可通过on GitHub获得。您可以使用AppDelegate.h中的定义在选择器和块之间切换。所有有趣的代码都在AppDelegate.m中。 (除非问题出在其他地方...)

解决方法

正如@Willeke指出的那样,这不是线程和其他问题的一个过分神秘的问题。不会。只是我在过去的几天里经常查看代码。

解决方案很简单:

break的{​​{1}}语句中的switch不存在。