之前在gitignore配置 与 隐藏文件设置文章中提及了macOS中关于隐藏文件的设置, 其本质都是通过Terminal
来执行如下命令实现的.
//设置显示隐藏文件夹
defaults write com.apple.finder AppleShowAllFiles YES
//杀死Finder进程, 会自动重启Finder
killall Finder
这次就写个macOS的简单应用来实现文件隐藏功能
创建macOS应用
1.首先创建macOS的应用
2.创建后的项目结构如下图, 查看MainMenu.xib文件, 类似于iOS应用的Main.storyboard, 是macOS应用的启动入口
配置StatusMenu (状态栏中应用图标的弹出菜单)
由于我们只是实现简单的状态栏图标小应用, 不需要窗口和状态栏的配置, 因此把
Main Menu
和Window
都删掉在
Object Library
中找到NSMenu
控件, 拖拽添加进来, 用于实现自定义弹出列表
3.在Object Library
中找到NSMenuItem
控件, 拖拽添加进来, 用于添加列表的单个选项
4.可以使用Separator Menu Item
来为选项之间添加分割线, 形成分组的关系
5.根据需要配置好StatusMenu的样式, 还是比较简单的, 最终配置如下:
代码实现
- 由于不需要显示窗口, 因此没对window属性做操作, 直接注释掉
// @IBOutlet weak var window: NSWindow!
- 将xib配置好的StatusMenu设置给本应用的状态栏图标
func applicationDidFinishLaunching(notification: NSNotification) {
let image = NSImage(named: "statusIcon");
// 为true时, 可以在不同主题的状态栏下自动渲染图片成对应的颜色
image?.template = true
// 设置statusItem的图标
statusItem.image = image;
// 设置本App的statusItem点击时显示的StatusMenu(已经在xib文件中配置好)
statusItem.menu = zStatusMenu;
}
运行起来可以得到下图的效果, 接下来完善每个menuItem
的事件处理
显示隐藏文件的处理
- 隐藏文件主要有两个操作, 一是配置隐藏文件的设置, 二是需要重新启动
Finder
, 让设置生效 - 修改隐藏文件的设置, 由
NSTask
(任务)来执行, 效果与在Terminal
中执行一样, 具体的解析器与参数, 参照terminal
命令做相关配置
/// 显示隐藏文件的响应事件
@IBAction func hiddenFileAction(sender: NSMenuItem) {
// ----- 隐藏文件设置 -----
let task = NSTask()
// 任务的解析器
task.launchPath = "/usr/bin/defaults"
if sender.state == NSOnState {
// MenuItem为非勾选状态
sender.state = NSOffState
// 任务的参数, 设置不显示隐藏文件
task.arguments = ["write", "com.apple.finder", "AppleShowAllFiles", "NO"];
} else {
// 切换成勾选状态, 设置显示隐藏文件
sender.state = NSOnState
task.arguments = ["write", "com.apple.finder", "AppleShowAllFiles", "YES"];
}
// 执行任务
task.launch()
// 等待任务完成, 再继续向下执行代码
task.waitUntilExit();
// ----- 重启Finder -----
let killTask = NSTask();
killTask.launchPath = "/usr/bin/killall";
killTask.arguments = ["Finder"]
killTask.launch()
}
打开指定目录的处理
let localPaths = [
"/Library/Developer/Xcode/UserData/CodeSnippets",
"/Library/Developer/Xcode/Archives",
"/Library/MobileDevice/Provisioning Profiles",
];
/// 打开本地目录的响应事件
@IBAction func openLocalPathAction(sender: NSMenuItem) {
// 获取当前登陆的用户名
let username = NSUserName()
// 拼凑完整的路径, tag值已经在xib中配置好, 与localPaths数组对应
let path = "/Users/\(username)\(localPaths[sender.tag])"
// ----- 打开指定文件夹路径 -----
let task = NSTask()
task.launchPath = "/usr/bin/open"
task.arguments = [path]
task.launch()
}
退出的处理
/// 退出应用的响应事件
@IBAction func quitAction(sender: AnyObject) {
// 正常退出应用
exit(0);
}
GitHub下载地址: https://github.com/linyanzuo/ZStatusMenu