【问题标题】:Saving with NSDocument in a Second ViewController在第二个 ViewController 中使用 NSDocument 保存
【发布时间】:2018-12-27 16:37:47
【问题描述】:

我试图简单地将使用 NSDocument 保存到 rtf。代码工作正常,但是当我尝试保存到不是窗口控制器的初始子视图控制器时,它会从模式中抛出一个错误,提示“文档”无法保存为“”。”

如何将文件保存到第二个视图控制器?

             Window Controller
                    |
           Login View Controller

          |                |
SidebarViewContoller   ViewController1
                                 |
                                  TableViewController 2 Replaces VC1  
                                   Save TextView in this VC

我希望能够从 ViewController2 中的 textView 将数据写入 My NSDocument 并将其保存到桌面 就像您在 Pages 中所做的那样

这里是代码

// 文档.swift

class Document: NSDocument {

var text = NSAttributedString()
var documentViewController: DocumentViewController? {
    return windowControllers[0].contentViewController as? DocumentViewController
}


override init() {
    super.init()
    // Add your subclass-specific initialization here.
}

override class var autosavesInPlace: Bool {
    return true
}

override func makeWindowControllers() {
    // Returns the Storyboard that contains your Document window.
    let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
    let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
    self.addWindowController(windowController)
}

override func data(ofType typeName: String) throws -> Data {
    // Save the text view contents to disk
if let textView = documentViewController?.textView {
        let rangeLength = textView.string.count

    textView.breakUndoCoalescing()
    let textRange = NSRange(location: 0, length: rangeLength)
    if let contents = textView.rtf(from: textRange) {
            return contents
        }
    }
    throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}

override func read(from data: Data, ofType typeName: String) throws {
    if let contents = NSAttributedString(rtf: data, documentAttributes: nil) {
        text = contents
    }
}

//第二视图控制器

override func viewDidAppear() {
    let document = self.view.window?.windowController?.document as!   Document
    textView.textStorage?.setAttributedString(document.text)
}

【问题讨论】:

  • 使用应用的视图控制器层次结构和您想要发生的情况更新您的问题。听起来您想在文本视图中显示文档的内容。对吗?
  • 是的,我想用 NSDocument 编写 textAttributedString。为了将 rtf 保存到桌面
  • View Controller 1 包含什么,它有什么作用?您需要提供有关整个应用程序的更多详细信息才能获得帮助。看起来您正在尝试构建 a tutorial I wrote to create a Mac rich text editor,但本教程旨在使用一个视图控制器。如果您使用多个视图控制器或尝试创建主从界面,您将对我在教程中编写的代码进行大量更改。
  • 好的。是的,谢谢你的教程,我从中学到了很多。我试图让它尽可能简单,因为它是一个复杂的应用程序。基本上,当应用程序启动时,它会将您带到登录页面。登录后,您将被推送到 masterSplitViewController.,其中 leftDetailView 作为用于导航的 sideBarTableView。在从 sideBarTableView 中选择它后,我有一个文档 viewController。这个 ViewController 是我需要使用 NSDocument 在 textView 中写入数据的地方。我会调整层次结构以更清晰地反映。

标签: swift xcode cocoa nsdocument


【解决方案1】:

按照您在应用程序中进行设置的方式,您无法将整个 NSDocument 的内容放在文本视图中。假设您在表格视图中有 10 个项目,并且选择一个项目会在文本视图中填充一些文本。您将无法在单个文档中为 10 个表格视图项中的每一个都拥有一个 NSDocument。

您要做的是创建一个表示文本文件的数据结构。想想书中的一个章节或剧本中的一个场景。在您的 NSDocument 子类中,您将拥有这些数据结构的数组。保存文档时,会将其保存为文件包装器,它是一个文件目录,在 Finder 中看起来像单个文件。对于表格视图中的每个项目,文件包装器中都会有一个文本文件。请参阅以下文章以了解有关文件包装器的更多信息:

Working with File Wrappers in Swift

现在您想知道的是如何在表格视图选择更改时填充文本视图。这对 Mac 故事板来说很痛苦,因为表格视图的控制器和文本视图的控制器是不同的场景。在表视图的视图控制器中实现委托方法tableViewSelectionDidChange。使用parent 属性获取拆分视图控制器。使用拆分视图控制器获取文本视图的控制器。将选定的行传递给文本视图的控制器,并使用它来获取要在文本视图中显示的正确文本文件。

拆分视图控制器应该存储对 NSDocument 的引用。使用parent 属性从文本视图的控制器访问拆分视图控制器。通过访问拆分视图控制器,您可以访问文档以使用与表格视图中的选定项对应的文本文件的内容填充文本视图。

【讨论】:

  • 谢谢马克,非常有帮助。我会试一试。
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多