前言
在Xcode中创建Cocoa Application 工程时,通常有两种选择类型:基于文档的Application
和非文档的Application
,具体是哪一种类型,关键在于创建工程的时候,你是否选中下图中的Create Document-based Application
选项:
基于文档的应用与非文档应用的主要区别:
-
基于文档的应用
让Mac OSX系统知道,你的应用可以打开具体类型的文件(如.txt,.png,.zip等) -
基于文档的应用
会自动实时保存编辑的内容,不需要额外编写代码 -
基于文档的应用
提供了很多文档编辑的操作(保存,打开,复制,导出,重命名等)
然而
如果你在产品开发初期,创建的项目工程并没有选择Create Document-based Application
选项,也就是说,你的项目是非基于文档的Application
,但由于某种原因(请不要问我是什么原因)
需要在后期的版本中添加文档编辑
的功能,难道还要把整个项目重建一遍?!场面不敢想象
,好了,其实是有方法可以实现的
,请继续看下去。。。。
追加文档功能的操作步骤:
1. 添加一个继承自NSDocument
的类:
2. 重写其中的几个父类方法:
-
makeWindowControllers()
:加载应用的窗口控制器(通常是NSWindowController或其子类
)
override func makeWindowControllers() {
// 获取Main.storyboard
let storyboard = NSStoryboard(name: "Main", bundle: nil)
// 获取window控制器
let controller = storyboard.instantiateController(withIdentifier: "NormalWindowsController") as! NSWindowController
// 添加窗口控制器到文档(产生关联)
self.addWindowController(controller)
// 获取内容控制器(通常是与用户交互的视图控制器)
editController = controller.contentViewController as! ViewController
// 对编辑控件进行初始化赋值
editController.editTextView.string = readText
}
-
data(ofType typeName: String) throws -> Data
:保存文件时,系统会调用此方法进行数据存储,通常情况你要在这里保存前的处理工作
// 保存文件时,系统会调用此方法进行数据存储
override func data(ofType typeName: String) throws -> Data {
let text = editController.editTextView.string ?? ""
return text.data(using: .utf8)!
}
-
read(from data: Data, ofType typeName: String) throws
: 打开文件时,系统会调用此方法进行数据读取你需要在这里将读取的数据进行处理,以便显示在相关的视图控件中
// 打开文件时,系统会调用此方法进行数据读取
override func read(from data: Data, ofType typeName: String) throws {
readText = String(data: data, encoding: .utf8) ?? ""
}
-
autosavesInPlace() -> Bool
: 是否需要自动保存编辑内容
// 是否需要自动保存编辑内容
override class func autosavesInPlace() -> Bool {
return true
}
3. 在info.plist中添加Document Type设置(重点!)
设置细节说明:
-
Name
: 这个可以自己任意填写,它的作用是在info.plist定义key的名称 -
Class(重点!)
: 这里要填写你继承自NSDocument
的类名,要在你的类名前加上命名空间(ObJective-C不用$(PRODUCT_MODULE_NAME)
-
Extensions
: 这个是用来标识你的应用可以打开或保存是的文件类型,可以根据你的实际需求填写,(也可是你自己定义的文件扩展名,比如:.mydoc,.xxyyyzz)
-
Role
: 这里选择你的应用文档作用:Editor
(编辑)Viewer
(浏览)None
(无)
4.取消Storyboard中的initial Controller设置
项目Demo
Tip-for-day中的NormalApplication 文件夹
尾语
文中
错误难免
,欢迎各位在评论中
指正,绝不删帖
,这样便于后面阅读的人
可以看到,并获得正确的指引。