【发布时间】:2020-08-25 07:22:41
【问题描述】:
生日快乐!
注意:下面链接的最小示例。我将避免冗长的代码摘录,而是简明扼要地解释问题。
我正在将一个旧的(但很小的)Cocoa 应用程序更新为当前的 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。 (除非问题出在其他地方……)
【问题讨论】:
-
confirmUnsavedChanges中的switch中的breaks 丢失。 -
@Willeke 哦。我的。上帝。我什至没有看到我没有从旧选择器中简单复制的一件事。将 if-else 转换为 switch 语句并破坏了一些东西。 ????♂️谢谢。显然这就是答案。请照原样张贴,我会接受。
标签: objective-c cocoa objective-c-blocks