【问题标题】:passing document data to the view controllers in yosemite (storyboards)将文档数据传递给优胜美地的视图控制器(故事板)
【发布时间】:2015-01-23 18:11:01
【问题描述】:

您应该何时将文档或文档数据传递给视图控制器?它不能在 prepareForSegue 中完成,因为作为包含/关系序列一部分的视图控制器不会调用此函数。

也不在 windowControllerDidLoadNib 中,因为它也不总是被调用。

【问题讨论】:

  • 这是一个概念问题。即使您从一个只有 1 个 viewController 的基于 Document 的新项目开始,这个问题也适用。这是一个与视图和文档的生命周期有关的问题。并非每个问题都需要代码。但既然你坚持:你把这条线放在哪里? windowController.contentViewController?.representedObject = self(即文档)
  • 我很好奇它是怎么做到的,因为我也在碰这堵砖墙。似乎有一种方法可以引用该对象,但如何?

标签: swift storyboard osx-yosemite nsdocument


【解决方案1】:

我目前的做法是这样的:

  1. 子类 NSDocument 并覆盖 makeWindowControllers 以将文档实例传递给窗口控制器。
  2. 子类 NSWindowController 并覆盖 windowDidLoad 以将文档(或任何其他类型的数据)传递给 contentViewController。
  3. 继承 NSViewController 以处理数据和/或将其传递给 childViewControllers。

  4. 如果另一个 NSViewController 中的某些内容(例如选择)发生了变化,请使用通知通知 NSViewControllers。

【讨论】:

  • 似乎 setDocument 不是 NSWindowController 的成员,我无法覆盖它。我发现的大多数示例都在 Objective-C 中,它们都覆盖了 setDocument。 NSDocument 中似乎也没有 setFileString。你能在这里分享你的 Swift 代码吗?谢谢。
  • 你不使用 setDocument。 NSWindowController 有一个“var 文档:AnyObject?”。所以你会做 aWindowController.document = self (或 yourDocument 实例)
  • windowDidLoad 在我初始化 windowController 时被调用,然后我才能将文档传递给它。我可能错过了什么? override func makeWindowControllers() { // 返回包含您的文档窗口的情节提要。让 storyboard = NSStoryboard(name: "Main", bundle: nil) 让 windowController: DocumentWindowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! DocumentWindowController self.addWindowController(windowController) windowController.document = self }
  • 该代码是正确的。您可以使用 windowWillAppear 从文档中加载数据,也可以将 didSet 添加到文档变量中。
  • 忘了说,我把主窗口控制器的contentViewController的representedObject设置为文档了。
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 2012-03-17
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2013-02-27
  • 2021-12-07
相关资源
最近更新 更多