MacOS开发 技术集锦macOS程序员

显示隐藏文件的macOS应用

2016-09-09  本文已影响347人  没刀的大佐

之前在<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:https://img.haomeiwen.com/i1723306/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的样式, 还是比较简单的, 最终配置如下:


代码实现

//    @IBOutlet weak var window: NSWindow!
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的事件处理


显示隐藏文件的处理

 /// 显示隐藏文件的响应事件
 @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>

上一篇下一篇

猜你喜欢

热点阅读