Elm*_*Cat 73
那种模态窗口称为Sheet.使用Storyboard segue或以NSViewController子类编程方式获取此行为非常容易.下面的示例只是由Xcode创建的空白OS X Cocoa应用程序.(我选择Swift作为语言,但它与Objective-C的工作方式相同.)
我添加到故事板的唯一内容是第二个用于工作表视图的View Controller,以及每个视图上的标签和按钮.
选择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)
    }
}
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)
    }
}
与第一个示例中一样,"Close Sheet"按钮连接到Sheet View Controller上的"dismissController:"操作.或者,您可以从ViewController类以编程方式调用该函数:
self.dismissController(sheetViewController)
有关更多信息,请参阅Apple"表格编程主题"文档:https: //developer.apple.com/library/content/documentation/Cocoa/Conceptual/Sheets/Sheets.html
| 归档时间: | 
 | 
| 查看次数: | 14833 次 | 
| 最近记录: |