显示隐藏文件的macOS应用

之前在<a href="//www.greatytc.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 (状态栏中应用图标的弹出菜单)

  1. 由于我们只是实现简单的状态栏图标小应用, 不需要窗口和状态栏的配置, 因此把Main Menu
    Window都删掉

  2. 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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,379评论 25 709
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,703评论 9 468
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,246评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,999评论 6 342
  • 打卡第九天 石榴花开了,橘色的,白色的,夹杂着绿叶,随手捡起掉落地上的花蕾,真美
    D_3c62阅读 160评论 0 0