【问题标题】:Modal NSSavePanel disappears after animating in when begun from a completion block从完成块开始动画后,模态 NSSavePanel 消失
【发布时间】: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


【解决方案1】:

正如@Willeke 所指出的,这并不是线程和诸如此类的过于神秘的问题。不。只是我这几天看代码太频繁了。

解决方法很简单:

confirmUnsavedChangesswitch 语句中的 breaks 缺失。

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多