Cocoa 中的自定义下拉菜单 window/dialog

Custom Drop-down window/dialog in Cocoa

Cocoa中的对话框windows有哪些替代方案?我需要创建一个自定义对话框(模态),用户可以在其中输入一些信息,当 he/she 按下确定时,我的应用程序将关闭此对话框并处理输入。 所以本质上,当你添加一个新文件(command + N)时,我需要像 Xcode 中的下拉菜单 window 这样的东西: [没有足够的声誉 post 截图] 到目前为止,我所发现的只是一些旧的列表和主题,人们称之为 sheet。但是建议的方法似乎已被弃用,例如

beginSheet: myCustomSheet
            modalForWindow: window
            modalDelegate: self
            didEndSelector: @selector(didEndSheet:returnCode:contextInfo:)
            contextInfo: nil

还有其他方法吗? 例如,我可以用自己的 xib 文件创建一个单独的 window,是否有某种设置可以使它成为 "panel" 或 "sheet"?我对术语有点困惑。

你要的是"sheet"。 sheet 是一个 window 附加到另一个并阻止大多数输入到它所附加的 window。

面板只是一种特定的 window。 NSPanelNSWindow 的子类。它有一些不同的行为和可能的风格。您可以将面板用作 sheet,但您不必这样做,也没有太大区别。

请注意 sheet 是 window-模态,而不是应用程序模态。也就是说,它会阻止用户使用它所附加的 window 执行其他操作,但不会阻止用户在应用程序的菜单或其其他 windows 中执行操作。这意味着 sheets 是异步操作的。您开始 sheet,然后在 sheet 的工作尚未完成的情况下继续执行。然后,您通常应该允许执行流程 return 到主事件循环。当 sheet 完成时,它将调用您指定的一些代码。

如果您需要同步行为,请改用应用模式对话框。

表示 sheet 的现代 API 是 -[NSWindow beginSheet:completionHandler:]。您将该消息发送到 "normal" window(例如文档 window)。第一个参数是 window,即 sheet。完成处理程序是 sheet 完成时 运行 的代码。

您的 sheet 中的控件通常会将其操作定位到 sheet 的 window 控制器(就像任何其他 window 一样)。在操作方法中,您可以在父级 window 上调用 -[NSWindow endSheet:]-endSheet:returnCode: 来完成 sheet 并确定传递给完成处理程序的结果代码。您可以使用 sheetParent 属性.

获取父级 window