【发布时间】:2015-09-06 17:27:45
【问题描述】:
【问题讨论】:
-
这个答案在 Obj-C 中,但它可能很有用:stackoverflow.com/a/8059193/1796907
-
这种窗口称为"sheet"。
标签: xcode macos swift nswindow
【问题讨论】:
标签: xcode macos swift nswindow
这种模式窗口称为工作表。使用 Storyboard segue 或以编程方式使用 NSViewController 子类很容易获得这种行为。下面的示例只是一个由 Xcode 创建的空白 OS X Cocoa 应用程序。 (我选择了 Swift 作为语言,但它与 Objective-C 的工作方式相同。)
我添加到情节提要的唯一东西是用于工作表视图的第二个视图控制器,以及每个视图上的标签和按钮。
选中 Sheet View 控制器并显示 Connections Inspector 选项卡后,将“Presenting Segues - sheet”连接到“Display Sheet”按钮。
将“Received Actions - dismissController:”连接到“Close Sheet”按钮。
就是这样!使这个示例工作不需要任何代码;只需构建并运行。
请注意,Xcode 使用两个自定义类文件创建默认项目。在 Storyboard 中,AppDelegate.swift 表示在 Application 场景中:
我们不需要在本示例中使用 AppDelegate,但您可以使用它与主菜单或其他东西进行交互。
自定义的 ViewController.swift 自定义类将用于呈现工作表。它在 View Controller 场景中表示:
要以编程方式实例化工作表视图控制器,它需要一个 Storyboard ID。在这里,我们将给它 ID “SheetViewController”。请注意,它仍然是一个普通的NSViewController;对于这个例子,我们不需要让它成为一个自定义类,但是您的应用程序可能想要:
在助手编辑器中显示 ViewController.swift 文件,按住 Ctrl 键将连接从“Display Sheet”按钮拖到自定义类中。这将为我们命名为“displaySheet”的@IBAction 函数创建存根代码:
在 ViewController.swift 文件中,我们将工作表视图控制器实现为惰性变量。它只会在第一次被访问时实例化一次。这将在第一次调用 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 “Sheets Programming Topics”文档: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Sheets/Sheets.html
【讨论】:
Objective-C 版本:
- (IBAction)displaySheet:(id)sender {
NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
[self presentViewControllerAsSheet:vc];
}
【讨论】: