NSDocumentController 是 macOS 文档型应用(Document-Based App)中的核心类之一,负责管理整个应用中打开的文档实例,处理用户的打开、新建、保存操作,并协调 NSDocument 的生命周期。
主要功能
1、管理文档集合:跟踪当前打开的 NSDocument 实例。
2、提供新建、打开等菜单行为:处理 File > New, File > Open 等操作。
3、协调窗口控制器:确保每个文档都有对应窗口。
4、文件类型判断:支持多种文件扩展名和类型的判断。
5、自动保存和恢复状态:与系统状态恢复机制集成。
6、统一入口:应用中唯一的 NSDocumentController.shared。
常用属性
1、shared:NSDocumentController类型,单例,所有文档操作的统一入口。
2、documents:[NSDocument]类型,当前打开的所有文档。
3、currentDocument:NSDocument?类型,当前处于活动状态的文档。
4、currentDirectory:URL类型,当前打开文档的默认目录。
5、recentDocumentURLs:[URL]类型,最近打开的文档路径。
6、documentClassNames:[String]类型,所有注册的 NSDocument 子类名称。
常用方法
1、openDocument(_:):打开一个文件(会自动判断文件类型并创建对应的 NSDocument)。
2、openDocument(withContentsOf:display:completionHandler:):打开指定文件,常用于异步文件打开。
3、newDocument(_:):创建新文档(等价于 File > New)。
4、makeDocument(for:withContentsOf:ofType:):给定文件创建文档对象(可 override)。
5、noteNewRecentDocumentURL(_:):添加到最近打开文档列表。
6、clearRecentDocuments(_:):清除最近打开文档记录。
7、document(for:):根据窗口返回其对应的文档。
使用场景
1、创建一个新文档
NSDocumentController.shared.newDocument(nil)
2、打开文件
NSDocumentController.shared.openDocument(nil)
3、打开指定URL
NSDocumentController.shared.openDocument(withContentsOf: url, display: true) { document, wasAlreadyOpen, error in
if let doc = document {
print("文档打开成功:\(doc)")
} else if let error = error {
print("打开失败:\(error)")
}
}
与NSDocument配合关系图

和SwiftUI搭配
SwiftUI 目前不直接支持 NSDocumentController,但可以用:
NSDocumentController.shared.openDocument(withContentsOf: url, ...)
并通过 NSHostingController 显示 SwiftUI 界面。
总结
NSDocumentController管理全局文档状态、创建/打开/关闭文档。
通过NSDocumentController.shared单例管理,配合NSDocument实现文档生命周期。
相关文章
macOS构建文档的NSDocument:https://fangjunyu.com/2025/07/03/macos%e6%9e%84%e5%bb%ba%e6%96%87%e6%a1%a3%e7%9a%84nsdocument/