如何在Mac OS中创建模态滑出窗口?

Vas*_*ily 22 macos xcode nswindow swift

如何在XCode上创建模态滑出窗口/视图"在窗口中",就像在这些截图中一样?

我尝试使用"身份验证面板样式"动画创建新的Window控制器,但我只收到XCode崩溃.

模态窗口

Elm*_*Cat 73

那种模态窗口称为Sheet.使用Storyboard segue或以NSViewController子类编程方式获取此行为非常容易.下面的示例只是由Xcode创建的空白OS X Cocoa应用程序.(我选择Swift作为语言,但它与Objective-C的工作方式相同.)

我添加到故事板的唯一内容是第二个用于工作表视图的View Controller,以及每个视图上的标签和按钮.

使用故事板Segue显示工作表视图

选择Sheet View控制器并显示Connections Inspector选项卡后,将"Presenting Segues - sheet"连接到"Display Sheet"按钮.

在此输入图像描述

将"Received Actions - dismissController:"连接到"Close Sheet"按钮.

在此输入图像描述

而已!没有代码可以使这个例子起作用; 只是建立和运行.


以编程方式显示工作表视图

请注意,Xcode使用两个自定义类文件创建默认项目.在Storyboard中,AppDelegate.swift在Application场景中表示:

在此输入图像描述

我们不需要在此示例中使用AppDelegate,但您可以将其用于与主菜单或其他内容的交互.

自定义ViewController.swift自定义类将用于显示工作表.它在View Controller场景中表示:

在此输入图像描述


要以编程方式实例化Sheet View Controller,它需要一个Storyboard ID.在这里,我们将给它ID" SheetViewController ".请注意,它仍然是一个平原NSViewController; 我们不需要为此示例创建自定义类,但您的应用程序可能希望:

在此输入图像描述


在助理编辑器中显示ViewController.swift文件,按住Ctrl键并将"显示工作表"按钮中的连接拖到自定义类中.这将为@IBAction函数创建存根代码,我们将其命名为"displaySheet":

在此输入图像描述

ViewController.swift文件中,我们将Sheet View Controller实现为一个惰性var.第一次访问它时,它只会被实例化一次.这将在第一次调用displaySheet函数时发生.

//  ViewController.swift

import Cocoa

class ViewController: NSViewController {

    lazy var sheetViewController: NSViewController = {
        return self.storyboard!.instantiateControllerWithIdentifier("SheetViewController")
        as! NSViewController
    }()

    @IBAction func displaySheet(sender: AnyObject) {

        self.presentViewControllerAsSheet(sheetViewController)
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift 4版本:

//  ViewController.swift

import Cocoa

class ViewController: NSViewController {

    lazy var sheetViewController: NSViewController = {
        return self.storyboard!.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "SheetViewController"))
        as! NSViewController
    }()

    @IBAction func displaySheet(sender: AnyObject) {

        self.presentViewControllerAsSheet(sheetViewController)
    }
}
Run Code Online (Sandbox Code Playgroud)

与第一个示例中一样,"Close Sheet"按钮连接到Sheet View Controller上的"dismissController:"操作.或者,您可以从ViewController类以编程方式调用该函数:

self.dismissController(sheetViewController)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Apple"表格编程主题"文档:https: //developer.apple.com/library/content/documentation/Cocoa/Conceptual/Sheets/Sheets.html