macOS开发之设置文件夹的图标
我搭建了个人博客主页, 欢迎访问: http://blog.joelzho.com/
一. 背景
前两天 iCloud 同步出现问题了, 我寻思换一款软件以解决两台 mac 之间的同步问题.
于是我下载了百度云同步盘
.
当我初始化完成之后, 它在我的Home目录下创建了一个它专用的文件夹,
如图:
咦? 百度云同步盘
这个文件夹怎么有自己的图标?
我知道如何通过 Finder
设置文件夹的图标, 但是程序是怎么实现的呢?
二. 研究过程
之前在 Windows
操作系统上, 有相关的实现经验.
所以我首先准备看看这个文件夹下有没有什么隐藏文件, 用于标识这个文件夹的图标.
于是我通过 Terminal
查看了这个文件夹下的内容
如图:
嗯… 虽然有一个在猜想之内的文件(Icon? 这个文件), 不过怎么大小为 0 呢?
OK, 研究到头, 最后在苹果开发者官网上找打了设置方法, 文末会给出链接.
三. 官网函数声明
以下是我从苹果开发者官网找到的, 如图:
从官网的文档来看, 我整理出了以下内容:NSWorkspace
类下的setIcon
可以对指定的文件或文件夹设定图标,
接收一个图片对象和一个绝对路径以及一个设定选项.
返回是否设置成功.
OK, 下面进入敲代码环节.
四. 函数调用
官网的声名是 Objective-C 语言的, 我这里用 Swift 语言来实现,
因为现在苹果系列的开发大多都用 Swift 语言.
虽然本人也喜欢 Objective-C 多一点, 不过尝试了Swift语言之后,
才发现这门语言真简单, 真好用, 真香~
言归正传.
我新建了一个以 mac cocoa 项目, 开发语言为 Swift.
并在资源目录下准备了一张用于设置为文件夹图标的图片.
如图:
然后在Main.storyboard
中添加了一个按钮, 并绑定了点击事件到ViewController.swift
里面,
然后我创建了一个文件夹并设定它的图标, 代码如下:
@IBAction func click(_ sender: Any) {
let path = "/Users/joel/Desktop/TestFolder"
var isSuccess = true
// Create folder
let fileManager = FileManager.default
do {
try fileManager.createDirectory(atPath: path,
withIntermediateDirectories: false,
attributes: nil)
}
catch let err as Error? { // When error
debugPrint(err.debugDescription)
isSuccess = false
}
if isSuccess {
// Set folder's icon
let workSpace = NSWorkspace.shared
let image = NSImage.init(named: "Ninja")
let option = NSWorkspace.IconCreationOptions.excludeQuickDrawElementsIconCreationOption
isSuccess = workSpace.setIcon(image, forFile: path, options: option)
}
}
OK, 以上代码就能够对文件夹的图标进行设置了.
以上代码运行完成之后, 通过 Terminal
查看文件夹里面的内容,
发现里面也有一个 Icon?
文件,大小也为 0B.
当我删除 Icon?
文件之后, 文件夹图标也变回系统默认的了.
五. 注意事项
我第一次运行这个代码时, 在创建文件夹那一步抛错了.
原来是我忘了关闭沙盒模式.
我使用的 Xcode 版本是: Version 10.1 (10B61)
,
新建的项目会在根目录下有一个 iconTest.entitlements
.
这个文件名字的格式为: 你的项目名.entitlements
.
这个文件里面有一个配置 为: App Sandbox
, 将它设置为 NO
就关闭了沙盒模式.
如图: