答案 0 :(得分:69)
这种模态窗口称为Sheet。使用Storyboard segue或使用NSViewController
子类以编程方式获取此行为非常容易。下面的示例只是由Xcode创建的空白OS X Cocoa应用程序。 (我选择Swift作为语言,但它与Objective-C的工作方式相同。)
我添加到故事板的唯一内容是第二个用于工作表视图的View Controller,以及每个视图上的标签和按钮。
选择了“纸张视图”控制器并显示“连接检查器”选项卡后,连接"显示分段 - 表"到"显示表"按钮。
连接"收到的动作 - dismissController:"到"关闭表"按钮。
那就是它!这个例子不需要代码就可以了;只是建立和运行。
请注意,Xcode使用两个自定义类文件创建默认项目。在故事板中, AppDelegate.swift 在应用程序场景中表示:
我们不需要在此示例中使用AppDelegate,但您可以将其用于与主菜单或其他内容的交互。
自定义 ViewController.swift 自定义类将用于显示工作表。它在View Controller场景中表示:
要以编程方式实例化Sheet View Controller,它需要一个Storyboard ID。在这里,我们将为其提供ID" SheetViewController "。请注意,它仍然是普通NSViewController
;我们不需要为此示例创建自定义类,但您的应用程序可能希望:
在助理编辑器中显示 ViewController.swift 文件,按住Ctrl键并拖动"显示表"按钮进入自定义类。这将为@IBAction函数创建存根代码,我们将命名" displaySheet":
在 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];}