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

Dav*_*son 7 macos cocoa swift xcode8

我正在开发一个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)
}
Run Code Online (Sandbox Code Playgroud)

它正在产生一个

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

错误.

Jos*_*zzi 11

窗口编程指南是一个伟大的地方,了解窗口是如何在一般管理.

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

在您的情况下,您可能希望在主窗口控制器中保留一组打开的详细信息窗口,这样如果主设备消失,详细信息也可以.打开详细信息窗口(创建控制器实例并显示其窗口)时,您将其控制器存储在数组中; 关闭时,从阵列中删除其控制器,以便取消分配.

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

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

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