首页 > 解决方案 > 从 Swift 或 Objective-C 应用程序中检索 Finder 标签

问题描述

使用NSURLAPI,我如何确定在目录上设置了哪些标签?我知道的唯一 API 确实返回了与标签关联的数字,但我不确定如何从返回值中提取特定标签。

例如,这将返回4目录B。我需要确定BlueGreen标签都已设置。

let url = URL(fileURLWithPath: "/Users/Username/Desktop/Test/B")
let resourceValues = try! url.resourceValues(forKeys: 
      [URLResourceKey.labelNumberKey])
print(resourceValues.labelNumber!) // 4

在此处输入图像描述

我见过一些使用 anenum将结果映射回 Swift,但这似乎不能处理多个标签。

enum LabelColor: Int {
    case none
    case gray
    case green
    case purple
    case blue
    case yellow
    case red
    case orange
}

所以OptionSet对于 Swift 来说,这似乎是最好的实现。

如果有人可以指出用于从总数中提取标签的算法,那就太好了!

标签: swiftmacoscocoafinder

解决方案


除了通过 shell之外,我不知道有任何方法可以将数值抓取到标签中。

但是,正如@Martin-R 建议的那样,您可以获取附加到文件的标签数组。我认为这是最好的,因为用户可以创建自定义标签,这可能很难用数字识别。

我建议使用 ⤵︎ 获取数组

var itemTags: [String] = []
do {
    let resources = try url.resourceValues(forKeys: [.tagNamesKey])
    if let tags = resources.tagNames {
        itemTags = tags // ["Green", "Red"]
    }
} catch {}

一旦你有了数组,你就可以使用某种枚举和开关、for 循环或 if/else 来匹配你自己指定的颜色。

秘制酱⤵︎

现在的问题是,如果你被沙盒化并且你尝试这个,你可能只会得到一个我想象的标签。它将是最前面的标签。

这只是 Apple 的另一项安全措施。要解决此问题,您的沙箱需要扩展到此资源。

在这篇文章中涉及安全范围的内容有点多,但是您可以尝试以下两件事。

  1. 用于NSOpenPanel()获取 url 或父目录 url。这将自动为您授予该会话对该资源的权限。您可以为它添加书签、解决它并开始访问它

  2. 停止使用沙盒

不幸的是,我不知道其他可行的解决方案。我选择了第一个,这是目前最不痛苦的。


推荐阅读