繁体   English   中英

如何使用 Cocoa 在 Swift 中打开 macOS 中的另一个窗口

[英]How do I open another window in macOS in Swift with Cocoa

我正在开发一个在表格视图中显示客户主记录列表的 macOS 应用程序。 双击表视图中的一行应该会打开一个新窗口,用户可以在其中查看和编辑客户信息。

这是一个使用故事板和 Swift 的 Xcode 8.3.3 项目。
它不是文档或核心数据应用程序。

我让主窗口工作到表视图正确显示记录并且关联的视图控制器正在接收双击事件并将它们记录到控制台的地步。

我为编辑窗口创建了一个额外的窗口控制器和视图,并通过临时将其标记为初始控制器来验证其基本功能。

我无法弄清楚的是当用户双击一行时如何显示该窗口的新实例。

感谢@Joshua Nozzi,我更接近了。 这是此时的代码。

let storyboard = NSStoryboard(name: "Main", bundle: nil)
if let windowController = storyboard.instantiateController(withIdentifier: "xyzzy") as? NSWindowController
{
  windowController.showWindow(self)
}

它正在产生一个

(故事板:0x620000000680)不包含标识符为“xyzzy”的控制器

错误。

Window Programming Guide是了解一般如何管理窗口的好地方。

具体来说(假设您知道如何在情节提要中呈现窗口控制器场景),您需要在某处存储对新窗口控制器的引用,以便它们在呈现时不会立即释放(并消失)。

在您的情况下,您可能希望在主窗口控制器中保留一系列打开的详细信息窗口,这样如果主窗口消失,细节也会消失。 当一个详细信息窗口打开时(创建一个控制器实例并显示其窗口),您将把它的控制器存储在数组中; 关闭时,您从数组中删除它的控制器,以便它被释放。

有多种方法可以做到这一点,具体取决于您想要多少控制权、您希望子窗口所有权如何工作等,但这种基本模式通常就足够了。

从故事板实例化一个新的窗口控制器场景:

var myWindowController = NSStoryboard(name: "MyStoryboardFileName", bundle: nil)?.instantiateControllerWithIdentifier("MyWindowControllerIdentifier") as MyWindowControllerClass
myWindowController?.showWindow(self)

此外,要打开新窗口,此代码可以帮助您

windowController.contentViewController = tabViewController

完整的代码就像我在我的项目中使用的那样:

@objc func openApplicationView(_ sender: Any?) {
    let mainStoryBoard = NSStoryboard(name: "Main", bundle: nil)
    let tabViewController = mainStoryBoard.instantiateController(withIdentifier: "tabView") as? TabViewController
    let windowController = mainStoryBoard.instantiateController(withIdentifier: "secondWindow") as! TabViewWindowController
    windowController.showWindow(self)
    windowController.contentViewController = tabViewController
}

如果您关闭了mainWindow ,它会很有帮助。 因此,您需要在自己的底层故事板中添加一个windowControllertabViewController (您可以使用普通视图控制器)。

在我这边,tabViewController 已由NSTabViewController扩展,选项卡视图组件已与此类绑定。

注意:我还在我的 Main.storyboard 中添加了windowController作为组件,并确定在编码端使用。

我正在开发一个 macOS 应用程序,该应用程序在表视图中显示客户主记录列表。 双击表视图中的一行应该会打开一个新窗口,用户可以在其中查看和编辑客户信息。

这是一个使用故事板和 Swift 的 Xcode 8.3.3 项目。
它不是文档或核心数据应用程序。

我让主窗口一直工作到表视图正确显示记录并且关联的视图控制器正在接收双击事件并将它们记录到控制台的点。

我为编辑窗口创建了一个额外的窗口控制器和视图,并通过临时将其标记为初始控制器来验证其基本功能。

我无法弄清楚的是如何在用户双击一行时显示该窗口的新实例。

感谢@Joshua Nozzi,我离我更近了。 这是此时的代码。

let storyboard = NSStoryboard(name: "Main", bundle: nil)
if let windowController = storyboard.instantiateController(withIdentifier: "xyzzy") as? NSWindowController
{
  windowController.showWindow(self)
}

它正在生成一个

(故事板:0x620000000680)不包含标识符为“xyzzy”的控制器

错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM