【问题标题】:Retrieving Finder tags from within a Swift or Objective-C app从 Swift 或 Objective-C 应用程序中检索 Finder 标签
【发布时间】:2019-02-14 06:50:05
【问题描述】:

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

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

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

我见过一些人使用enum 将结果映射回 Swift,但这似乎无法处理多个标签。

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

因此,OptionSet 似乎是 Swift 的最佳实现。

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

【问题讨论】:

  • tagNamesKey
  • @vadian 这会将本地化的标签名称作为字符串返回。我希望在不同的语言环境下运行时使用数值使其更加健壮。谢谢!

标签: swift macos cocoa finder


【解决方案1】:

除了through a 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。这将自动为您授予该会话对该资源的权限。你可以收藏它,解决它,and start accessing it

  2. 停止使用沙盒

很遗憾,我不知道其他可行的解决方案。我选择了第一个,目前最不痛。

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2017-02-04
    相关资源
    最近更新 更多