繁体   English   中英

如何在NSDocument macOS应用程序中以编程方式打开文档?

[英]How to open programmatically a document in a NSDocument macOS app?

我是macOS编程的新手,我创建了一个NSDocument应用程序项目来学习这个架构。

一切正常,我可以创建一个文档,保存它,并使用标准UI控件从Finder打开一个文档。

我正在尝试以编程方式保存和打开文档。 我实现了这两个动作。 保存工作正常,但读取不起作用。 编辑:我的意思是没有显示文档窗口。

如果有人能告诉我我做错了什么,我将非常感激。

// this seems to work because the document is created and I can open it with drag and drop over the app
@IBAction func saveButtonPressed(_ sender: Any) {
    let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first // or .applicationSupportDirectory

    let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)

    if (try? document.write(to: docURL!, ofType: "com.myCompany.docuExperiments")) != nil {
    } else {
        print("An error occured")
    }
}

// the document window is not shown
@IBAction func loadButtonPressed(_ sender: Any) {
    let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first // or .applicationSupportDirectory

    let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)

    if (try? document.read(from: docURL!, ofType: "com.myCompany.docuExperiments")) != nil {
    } else {
        print("An error occured")
    }
}

这似乎有效。

保存文件:

@IBAction func saveButtonPressed(_ sender: Any) {
    let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first

    let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)

    if (try? document.write(to: docURL!, ofType: "com.myCompany.docuExperiments")) != nil {
    } else {
        print("An error occured")
    }
}

打开文档:

@IBAction func loadButtonPressed(_ sender: Any) {
    let documentController = NSDocumentController.shared()

    let directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first

    let docURL = URL(string:"MyFile.docuExperiments", relativeTo:directoryURL)

    documentController.openDocument(withContentsOf: docURL!, display: true) {
        // completionHandler (NSDocument?, Bool, Error?)
        (document, documentWasAlreadyOpen, error) in
        if error != nil
        { print("An error occured")
        } else {
            if documentWasAlreadyOpen
            {
                print("documentWasAlreadyOpen: true")
            } else {
                print("documentWasAlreadyOpen: false")
            }
        }
    }

}

(感谢Willeke的提示)。

NSDocument管理来自URL的文档显示。 它应该用于启动文档的打开和保存的NSDocumentController (尽管如你NSDocument ,没有什么能阻止NSDocument 编写文档的副本)。

来自文档

NSDocumentController创建和管理文档

应用程序的NSDocumentController对象管理应用程序中的文档。 在MVC设计模式中,NSDocumentController对象是高级控制器。 它具有以下主要职责:

  • 创建空文档以响应“文件”菜单中的“新建”项
  • 创建使用文件中的数据初始化的文档, 以响应“文件”菜单中的“打开”项
  • 跟踪和管理这些文件
  • 处理与文档相关的菜单项,例如“打开最近”

(我的重点)

如果你想使用自己的例程,你需要NSDocumentController并将你的开放例程放在那里。 但是它已经拥有了所有这些逻辑,所以你需要做的就是将你的按钮挂钩到File - > Open的目标,这将是func beginOpenPanel(completionHandler: @escaping ([URL]?) -> Void) in 默认的 NSDocumentController 所以没有必要这样做。 只需阅读NSDocumentController文档(上面链接)

暂无
暂无

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

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