在Storyboard中设置NSWindowController/NSViewController的“Presentation”选项

33
在Cocoa Storyboard中,Attribute Inspector中的“Presentation”选项到底是做什么用的?它提供了两个选择:
- Single(单一) - Multiple(多选)
附注:当通过谷歌搜索标题时,搜索结果与PowerPoint演示文稿相关。
1个回答

18

演示样式影响“Show”跳转。可能也会影响其他跳转,但我只测试了一个 Show 跳转。我在 OS X 10.10.5 (Yosemite) 上使用 Xcode 7.1.1 进行测试。

如果窗口控制器的演示样式是“Multiple”(默认值),那么对窗口控制器的“Show”跳转始终会从 storyboard 加载一个新的窗口控制器实例。这意味着您可能会同时拥有多个窗口控制器实例,每个实例都有自己的窗口显示在屏幕上。默认情况下,这些窗口将堆叠在彼此上方,因此在移动或关闭其中一个之前,不会很容易看出发生了什么。

如果窗口控制器的演示样式为“Single”,并且已经从 storyboard 中加载了窗口控制器实例,并且该窗口控制器仍然存在(大概率是因为它的窗口仍然在屏幕上),那么对该视图控制器的“Show”跳转将不会创建新的窗口控制器实例。相反,Show 跳转将把现有窗口控制器的窗口带到最前面。

如果您想要类似于 Xcode 的“设备”窗口的行为,那么这种行为会很有用,因为这样只能有一个这样的窗口。您可以在 storyboard 中为“Window”菜单创建一个“Devices”菜单项,并使用 Show 跳转将其连接到 storyboard 中的 Devices 窗口控制器。将 Devices 窗口控制器的演示样式设置为 Single。现在,如果已经存在 Devices 窗口控制器,则该菜单项将不会创建第二个 Devices 窗口控制器。

您可能希望以某种方式将窗口的 excludedFromWindowsMenu 属性设置为 true,以便它不会在 Window 菜单中显示两次(因为默认情况下它会附加到该菜单)。例如,您可以使用 NSWindowController 的子类来设置它:

class DevicesWindowController: NSWindowController {
    override func windowDidLoad() {
        super.windowDidLoad()
        window?.excludedFromWindowsMenu = true
    }
}

视图控制器也有演示样式,因为您还可以将显示 segue 连接到视图控制器。连接到视图控制器的 Show segue 会在运行时自动创建一个窗口控制器以包含视图控制器。窗口控制器的演示样式实际上设置为视图控制器的演示样式,因此如果将视图控制器的演示设置为 Single,则会获得相同的单例行为。

据我所知,故事板设置没有相应的公共属性或方法可供在代码中使用。

如果将 Show segue 连接到故事板引用(在 Xcode 7 中新增),则该 segue 忽略目标窗口控制器的演示样式,并表现得好像它是“多个”。即使目标实际上与引用在同一个故事板中,这种情况仍会发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接