如何从菜单项创建 'sheet' segue

How to create 'sheet' segue from a Menu Item

我有一个 Swift Cocoa 应用程序可以从菜单项中选择一个视图。 当我从界面生成器创建 segue 时,选项是: 显示、模态和自定义。

然而,当我通过按钮创建 segue 时,会出现更多选项: sheet、弹出窗口、显示、自定义、模态

我需要从该菜单项创建一个 sheet segue。 我错过了什么吗?或者仅从菜单项中禁用这些额外选项

你没有遗漏任何东西。我解决这个问题的方法是选择一个 segue 选项,然后使用更改编辑器打开更改后的故事板,以找到为 segue 更改的确切位置。当以 XML 打开时,这很容易看到。然后我手动将 segue 编辑为 "sheet"。保存故事板,一切正常。

Sheet 无法从菜单项启用 segue,因为它没有任何意义。一个 segue 代表了一种让某些东西从给定的 UI 元素出现到另一个元素的方法。

您根本无法使菜单项中的 window 或其他任何内容显示为 sheet;这没有任何意义。

如果 sheet 只能出现在一个 view/window 中,请从这个 view/window 进行 sheet 转场,然后在您的菜单项中调用 performSegue:使用您的 segue 名称执行操作。 否则,您不应该使用 segue 并通过一些代码使 sheet 出现。

Segues 在 iOS 上特别有用,其中从一个视图到另一个视图的转换通常只从一个地方触发。不过,在 Mac OS 上,有更多的自由和可能性。 Segues 没那么有用。

感谢您的提示。

但是我需要 segue,因为它与应用程序中的 "import" 选项有关

此外,经过一些研究,我发现 "sheet" segue 需要附加 window,而菜单与任何 window 无关。 这就是为什么当我尝试从按钮创建 segue 时出现该选项的原因,因为按钮在视图内,视图也在 window.

解决方案与Frizlab所说的有关,segue必须附加到可以显示它的view/window,然后在单击菜单时执行该segue

正如其他人所说,菜单项无法执行依赖于 window 的任何附件的转场。不幸的是,在某些情况下您确实想要从菜单项触发 "sheet" segue。例如,Xcode 本身就是这样做的。 Xcode window 最左下角的 + 将打开一个 three-item 菜单,所有菜单都执行 "sheet" segue。

一个选项是定义两个情节提要场景之间的转场,给转场一个标识符,然后以编程方式执行转场。

  1. 单击您的第一个场景,然后在场景的 header 中查找视图控制器图标。它是一个包含白色方块的蓝色圆圈。

  2. control-drag 从那个 View Controller 图标到第二个场景(你想在 sheet 中显示的场景)。应该在两个场景之间创建一个 segue。这个 segue 将提供完整的 segue 类型,包括 "Sheet".

  3. select 新的转场并显示属性检查器。给 segue 一个标识符,例如"ShowEditView"

  4. 手动触发转场。作为一个简单的测试,将一个按钮拖到场景一上,并将其连接到您的场景一视图控制器:

    @IBAction func wasClicked(sender: AnyObject) {
        print("Test button was clicked.")
        self.performSegueWithIdentifier("ShowEditView", sender: self)
    }
    

仅故事板解决方案

  1. 在主视图中添加一个NSStackView。将其标记为对属性检查器隐藏
  2. 向这个隐藏的 NSStackView 添加一个 NSButton
  3. 控制从 NSMenuItemNSButton 的拖动(来自第 2 步)
  4. 拖动结束时会出现一个菜单,select performClick:。这将模拟鼠标点击 NSButton
  5. 控件从 NSButton 拖动到视图,现在可以在菜单中看到 sheet 选项。
  6. 完成!!

注意:为每个要从 NSMenu 显示为 Sheet 的视图向隐藏的 NSStackView 添加一个 NSButton