之前在<a href="http://www.jianshu.com/p/10ca00d2cb60">gitignore配置 与 隐藏文件设置</a>文章中提及了macOS中关于隐藏文件的设置, 其本质都是通过Terminal
来执行如下命令实现的.
//设置显示隐藏文件夹
defaults write com.apple.finder AppleShowAllFiles YES
//杀死Finder进程, 会自动重启Finder
killall Finder
这次就写个macOS的简单应用来实现文件隐藏功能
创建macOS应用
1.首先创建macOS的应用
<img src="http://upload-images.jianshu.io/upload_images/1723306-6c2ed68904675c1e.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width=300>
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下载地址: <a href="https://github.com/linyanzuo/ZStatusMenu">https://github.com/linyanzuo/ZStatusMenu<a>