美文网首页开发点滴iOS之MAC端开发iOS Developer
Mac OSX 给现有的应用追加基于文档的功能

Mac OSX 给现有的应用追加基于文档的功能

作者: 代码行者 | 来源:发表于2017-06-27 13:42 被阅读246次
    图片来自网络

    前言

    在Xcode中创建Cocoa Application 工程时,通常有两种选择类型:<code>基于文档的Application</code> 和<code>非文档的Application</code>,具体是哪一种类型,关键在于创建工程的时候,你是否选中下图中的<code>Create Document-based Application</code>选项:


    创建工程界面

    基于文档的应用与非文档应用的主要区别:

    • <code>基于文档的应用</code>让Mac OSX系统知道,你的应用可以打开具体类型的文件(如.txt,.png,.zip等)
    • <code>基于文档的应用</code>会自动实时保存编辑的内容,不需要额外编写代码
    • <code>基于文档的应用</code>提供了很多文档编辑的操作(保存,打开,复制,导出,重命名等)

    然而
    如果你在产品开发初期,创建的项目工程并没有选择<code>Create Document-based Application</code>选项,也就是说,你的项目是<code>非基于文档的Application</code>,但由于某种原因<code>(请不要问我是什么原因)</code>需要在后期的版本中添加<code>文档编辑</code>的功能,难道还要把整个项目重建一遍?!<code>场面不敢想象</code>,好了,<code>其实是有方法可以实现的</code>,请继续看下去。。。。

    追加文档功能的操作步骤:

    1. 添加一个继承自<code>NSDocument</code>的类:
    添加继承NSDocument的类文件
    2. 重写其中的几个父类方法:
    • <code>makeWindowControllers()</code> :加载应用的窗口控制器(通常是<code>NSWindowController或其子类</code>)
     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
        }
    
    • <code>data(ofType typeName: String) throws -> Data </code>:保存文件时,系统会调用此方法进行数据存储,通常情况<code>你要在这里保存前的处理工作</code>
       // 保存文件时,系统会调用此方法进行数据存储
        override func data(ofType typeName: String) throws -> Data {
            let text = editController.editTextView.string ?? ""
            return text.data(using: .utf8)!
        }
    
    • <code>read(from data: Data, ofType typeName: String) throws </code>: 打开文件时,系统会调用此方法进行数据读取<code>你需要在这里将读取的数据进行处理,以便显示在相关的视图控件中</code>
      // 打开文件时,系统会调用此方法进行数据读取
        override func read(from data: Data, ofType typeName: String) throws {
          readText = String(data: data, encoding: .utf8) ?? ""
        }
    
    • <code>autosavesInPlace() -> Bool</code>: 是否需要自动保存编辑内容
      // 是否需要自动保存编辑内容
        override class func autosavesInPlace() -> Bool {
            return true
        }
    
    3. 在info.plist中添加Document Type设置(重点!)
    添加Document Type
    设置细节说明
    设置细节
    • <code>Name</code> : 这个可以自己任意填写,它的作用是在info.plist定义key的名称
    • <code>Class(重点!)</code>: 这里要填写你继承自<code>NSDocument</code>的类名,要在你的类名前加上命名空间(ObJective-C不用<code>$(PRODUCT_MODULE_NAME)</code>
    • <code>Extensions</code>: 这个是用来标识你的应用可以打开或保存是的文件类型,可以根据你的实际需求填写,<code>(也可是你自己定义的文件扩展名,比如:.mydoc,.xxyyyzz)</code>
    • <code>Role</code>: 这里选择你的应用文档作用:<code>Editor</code> (编辑)<code>Viewer</code>(浏览)<code>None</code>(无)
    4.取消Storyboard中的initial Controller设置
    取消initial Controller

    项目Demo

    Tip-for-day中的NormalApplication 文件夹

    尾语

    文中<code>错误难免</code>,欢迎各位在<code>评论中</code>指正,<code>绝不删帖</code>,这样便于<code>后面阅读的人</code>可以看到,并获得<code>正确的指引。</code>

    相关文章

      网友评论

        本文标题:Mac OSX 给现有的应用追加基于文档的功能

        本文链接:https://www.haomeiwen.com/subject/uxwscxtx.html