问题描述
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
不存在。