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

时间:2015-09-06 17:27:46

标签: xcode macos swift nswindow

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

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

modal window

2 个答案:

答案 0 :(得分:69)

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

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

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

选择了“纸张视图”控制器并显示“连接检查器”选项卡后,连接"显示分段 - 表"到"显示表"按钮。

enter image description here

连接"收到的动作 - dismissController:"到"关闭表"按钮。

enter image description here

那就是它!这个例子不需要代码就可以了;只是建立和运行。

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

请注意,Xcode使用两个自定义类文件创建默认项目。在故事板中, AppDelegate.swift 在应用程序场景中表示:

enter image description here

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

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

enter image description here

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

enter image description here

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

enter image description here

ViewController.swift 文件中,我们将Sheet View Controller实现为lazy 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)
    }
}

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)
    }
}

与第一个例子中一样,"关闭表"按钮连接到" dismissController:"工作表视图控制器上的操作。或者,您可以从ViewController类以编程方式调用该函数:

self.dismissController(sheetViewController)

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

答案 1 :(得分:3)

Objective-C版本:

- (IBAction)displaySheet:(id)sender {
    NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
    NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
    [self presentViewControllerAsSheet:vc];}