2017-01-21 10 views
2

Я пытаюсь получить список всех доступных тегов Finder.Как получить все доступные теги Finder?

Я нашел NSWorkspace().fileLabels, который не возвращает массив, но только массив цветов тегов, а не сами теги:

print(NSWorkspace.shared().fileLabels) // prints ["None", "Gray", "Green", "Purple", "Blue", "Yellow", "Red", "Orange"] 

Который, как вы можете видеть, даже не все теги по умолчанию, это не хватает Главная, Работа и Важная информация и, очевидно, не имеет никаких пользовательских, которые я создал. Похоже, что это просто красивые имена, которые идут с fileLabelColors.

Я нашел NSMetadataQuery для реального поиска вещей, но как мне получить список всех тегов, которые я создал в Finder?

ответ

0

NSWorkspace.shared().fileLabels возвращает только те системные теги, которые были доступны при создании учетной записи пользователя (системные теги по умолчанию).

К сожалению, API в macOS для получения тегов, созданных вами в Finder, отсутствует.

Раствор для разбора ~/Library/SyncedPreferences/com.apple.finder.plist:

func allTagLabels() -> [String] { 
    // this doesn't work if the app is Sandboxed: 
    // the users would have to point to the file themselves with NSOpenPanel 
    let url = URL(fileURLWithPath: "\(NSHomeDirectory())/Library/SyncedPreferences/com.apple.finder.plist") 
    let keyPath = "values.FinderTagDict.value.FinderTags" 
    if let d = try? Data(contentsOf: url) { 
     if let plist = try? PropertyListSerialization.propertyList(from: d, options: [], format: nil), 
      let pdict = plist as? NSDictionary, 
      let ftags = pdict.value(forKeyPath: keyPath) as? [[AnyHashable: Any]] 
     { 
      return ftags.flatMap { $0["n"] as? String } 
     } 
    } 
    return [] 
} 

let all = allTagLabels() 
print(all) 

Это получает все Finder теги этикетки.

Вы также можете выбрать только пользовательские теги (игнорировать системные из них):

func customTagLabels() -> [String] { 
    let url = URL(fileURLWithPath: "\(NSHomeDirectory())/Library/SyncedPreferences/com.apple.finder.plist") 
    let keyPath = "values.FinderTagDict.value.FinderTags" 
    if let d = try? Data(contentsOf: url) { 
     if let plist = try? PropertyListSerialization.propertyList(from: d, options: [], format: nil), 
      let pdict = plist as? NSDictionary, 
      let ftags = pdict.value(forKeyPath: keyPath) as? [[AnyHashable: Any]] 
     { 
      return ftags.flatMap { tag in 
       if let n = tag["n"] as? String, 
        tag.values.count != 2 
       { 
        return n 
       } 
       return nil 
      } 
     } 
    } 
    return [] 
} 
+0

Ах спасибо. Следующий вопрос, хотя, поскольку я не нашел на нем никакой документации, знаете ли вы, где документированы такие вещи, как com.apple.finder.plist. Кроме того, так же, как FYI 'allTagLabels' вернул все теги, но' customTagLabels' не возвратил все созданные мной теги. Пройти через различия, вероятно, будет полезно для меня. – mhurron

+0

Добро пожаловать. К сожалению, поскольку для этого нет публичного API, больше нет действительной документации. Вы можете распечатать содержимое 'pdict', чтобы увидеть все, что доступно в этом файле plist. – Moritz

 Смежные вопросы

  • Нет связанных вопросов^_^