专栏首页macOS 开发学习Mac OSX 给现有的应用追加基于文档的功能

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 条评论
登录 后参与评论

相关文章

  • 给Mac OSX的Dock上加入最近打开的应用功能

    如果你想把你的Dock加入一个类似于最近打开的应用的功能,方便快速打开最近使用的应用的话,有什么办法吗?

    EltonZheng
  • 博客 | Github开源人体姿态识别项目OpenPose中文文档

    人体姿态识别与估计的应用场景:抖音尬舞机、体育动作教学、3D健身教练、3D试衣、绘画辅助、游戏人物动作采集。

    AI研习社
  • 在自己的电脑上安装GitBook For Mac

    之前写了一篇 在自己的服务器上安装GitBook ,发布于 2015-04-20,当时的安装环境是 CentOS 6.X_64Bit,今天想再研究一下这个 Gi...

    他叫自己MR.张
  • 推荐给 Mac 新手准备的工具套餐!

    本文主要记录Mac开发环境的设置,以及一些优秀软件,使用技巧等。所有的设置 、软件 以及技巧 都追求极致简洁和极致效率,最大可能提升工具效率,提升生产力。当然大...

    Java技术江湖
  • 配置tensorflow GPU 版本填坑路

    导语 运气好按照教程一把过,运气不好遇到一堆抓狂的问题,记录下踩到的坑 如果是练习教程中的例子tensorflow cpu 版本够用了,要训练的话...

    MelonTeam
  • 推荐给 Mac 新手准备的工具套餐!

    本文主要记录Mac开发环境的设置,以及一些优秀软件,使用技巧等。所有的设置 、软件 以及技巧 都追求极致简洁和极致效率,最大可能提升工具效率,提升生产力。当然大...

    芋道源码
  • 跨平台后门Mokes现已加入OS X豪华午餐

    近期,卡巴斯基实验室的安全研究人员发现了一种恶意软件,这种恶意软件可以在目前主流的几款操作系统平台上运行,包括Windows、Linux和Mac OSX。 根据...

    FB客服
  • 2020 搞个 Mac 玩玩吧!

    本文主要记录Mac开发环境的设置,以及一些优秀软件,使用技巧等。所有的设置 、软件 以及技巧 都追求极致简洁和极致效率,最大可能提升工具效率,提升生产力。当然大...

    芋道源码
  • 2020,建议搞个 Mac 玩玩!

    本文主要记录Mac开发环境的设置,以及一些优秀软件,使用技巧等。所有的设置、软件以及技巧都追求极致简洁和极致效率,最大可能提升工具效率,提升生产力。当然大家如果...

    逆锋起笔
  • 基于 hook 和 gmock 开展单元测试

    单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函...

    腾讯移动品质中心TMQ
  • 我的vim配置文件,再度升级

    原来的repo放在 spf13-vim-leoatchina,因为原来一时脑抽,把中文字体放进去后导致体积较大,影响速度,所以重开一个repo并把windows...

    py3study
  • iKiss - Mac OSX 应用开发历程分享技术正题:

    好久没更新简书内容了,排除个人松懈的因素之外(当然,这点我是不会轻易承认的?),主要是公司最近一个月连续上马两个项目,除了让人无法拒绝又蛋疼不已需求和欲壑难填的...

    代码行者
  • 如何接入远程 OS X 物理机进行 Jenkins 流水线构建

    本文同样适用于接入 ARM、MIPS 架构,FreeBSD、Windows 系统的物理机,如果 Jenkins 能连上构建机,可以跳过 Frp 部分。

    陈少文
  • docker学习(5) 在mac中创建mysql docker容器

    github上有一个专门的docker-libary项目,里面有各种各样常用的docker镜像,可以做为学习的示例,今天研究下其中mysql镜像的用法,国内镜像...

    菩提树下的杨过
  • 基于Python的远程管理工具(RAT) – Stitch

    Stitch是一款基于Python的跨平台远程管理工具。由于其跨平台性,Stitch允许用户针对Windows, Mac OSX 或 Linux分别定制不同的p...

    FB客服
  • 程序员必备的8款高效工具

    效率神器,搜索和快速启动的功能,以及工使用自定义插件的工作流功能。让你的效率提升N的档次。

    陈宇明
  • mongodb基础应用

    MongoDB 用 use + 数据库名称(use DATABASE_NAME) 的方式来创建数据库。use 会创建一个新的数据库,如果该数据库存在,则返回这个...

    shirley
  • git——简易指南

    Git对于我来说,只知道是一个版本控制器,类似于乌龟的svn。其中也仅仅会几个常的命令,比如说“更新git pull”、“提交git push”等等,因为记得当...

    李维亮
  • 在线商城项目07-mac下mongodb的下载与配置

    这一章本来不想讲的,因为关于配环境这种事,其实网上真的很多资料,但是考虑到确实好多人都不喜欢配环境这种事,因为觉着很麻烦而止步不前,很是可惜。这一节我们来看看如...

    love丁酥酥

扫码关注云+社区

领取腾讯云代金券