【问题标题】:How to create modal slide-out window in Mac OS?如何在 Mac OS 中创建模态滑出窗口?
【发布时间】:2015-09-06 17:27:45
【问题描述】:

如何在 Xcode 中创建模态滑出窗口/视图“窗口内”,就像这些屏幕截图一样?

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

【问题讨论】:

标签: xcode macos swift nswindow


【解决方案1】:

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

我添加到情节提要的唯一东西是用于工作表视图的第二个视图控制器,以及每个视图上的标签和按钮。

使用 Storyboard 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 场景中表示:


要以编程方式实例化工作表视图控制器,它需要一个 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

【讨论】:

  • 以编程方式调用该控制器的最佳方法是什么?
  • 我已经扩展了答案,包括指令和代码以编程方式实现。
  • 关闭工作表窗口时调用主/第一个视图控制器的哪个方法?每当关闭工作表窗口时,我想重新加载视图控制器上的表格。
  • @avi 实现这一目标的一种方法是将 sheetViewController 子类化,而不仅仅是使用普通的 NSViewController。
  • 如何在工作表被解除之前从 sheetViewController 获取结果?
【解决方案2】:

Objective-C 版本:

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

【讨论】:

    猜你喜欢
    • 2012-05-24
    • 2020-10-22
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多