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

图片来自网络

前言

在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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏和蔼的张星的图像处理专栏

1.Win10+VsCode的C/CPP编译环境搭建

我是从开始学C++的时候就一直用的是visual studio,毕竟宇宙第一IDE,写和调试都是超级方便快捷,唯一的缺点可能就是启动慢一点。 之前电脑没有换固...

7836
来自专栏小白安全

分享几个绕过URL跳转限制的思路

大家对URL任意跳转都肯定了解,也知道他的危害,这里我就不细说了,过~ 大家遇到的肯定都是很多基于这样的跳转格式 http://www.xxx.x...

7516
来自专栏前端新视界

使用 gulp-file-include 构建前端静态页面

前言 虽然现在单页面很流行,但是在 PC 端多页面还是常态,所以构建静态页面的工具还有用武之地。最近也看到了一些询问如何 include HTML 文件的问题。...

3696
来自专栏Java帮帮-微信公众号-技术文章全总结

Python常见面试题【悟空教程】

1.MySQL 数据库总结 MySQL 可以建多少个数据库,理论上是没有限制的,每一个数据库可以有上亿的对象,但是一般基于硬件要求、效率问题一般不超过64个, ...

1692
来自专栏程序员互动联盟

【答疑释惑】菜鸟怎么调试简单程序?

首先公布昨天留的课后作业答案的宏定义函数的答案 #define f(a, b, x) a*x+b printf("%d, %dn", f(3,2,1), ...

3445
来自专栏程序员的碎碎念

ThinkPHP基础知识(二)

今天闲来无事,继续来看我们的tp下一个教程(勉强叫做这个吧)。看前面的博客文章我们知道: ? 那么,我们怎么创建控制器和方法呢? 一、创建控制器和方法 创建控制...

3976
来自专栏java思维导图

开源项目renren-fast解读,让java不再难懂(二)

1、百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览...

2524
来自专栏Puppeteer学习

一步一步学Vue(七)

1613
来自专栏程序员八阿哥

王老板Python面试(9):整理的最全 python常见面试题(基本必考)

1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用...

1801
来自专栏北京马哥教育

27个Linux文档编辑命令

? 文 | 豌豆 来源 | 菜鸟教程 ? 豌豆贴心提醒,本文阅读时间5分钟,文末有秘密! Linux col命令 Linux col命令用于过滤控制字...

5016

扫码关注云+社区

领取腾讯云代金券