Swift 3:设置Finder标签颜色

Swift 3:设置Finder标签颜色,第1张

概述我正在尝试设置取景器显示的彩色标签.我所知道的唯一功能是setResourceValue.但这需要本地化的名称! 我可以想象我的母语和英语,但我不知道所有其他人.我不敢相信,这应该是这样的. 是翻译函数,它采用像enum或int这样的标准参数并提供本地化的颜色名称? 我有一个正在运行的部分,但只有两种语言(德语和英语): let colorNamesEN = [ "None", "Gray", " 我正在尝试设置取景器显示的彩色标签.我所知道的唯一功能是setResourceValue.但这需要本地化的名称!

我可以想象我的母语和英语,但我不知道所有其他人.我不敢相信,这应该是这样的.

是翻译函数,它采用像enum或int这样的标准参数并提供本地化的颜色名称?

我有一个正在运行的部分,但只有两种语言(德语和英语):

let colornamesEN = [ "None","Gray","Green","Purple","Blue","Yellow","Red","Orange" ]let colornamesDE = [ "","Grau","Grün","lila","Blau","Gelb","Rot","Orange" ]public enum Tagcolors : Int8 {    case None = -1,Gray,Green,Purple,Blue,Yellow,Red,Orange,Max}//let theURL : NSURL = NSURL.fileURLWithPath("/Users/dirk/documents/MyLOG.txt")extension NSURL {    // e.g.  theURL.setcolors(0b01010101)    func tagcolorValue(tagcolor : Tagcolors) -> UInt16 {        return 1 << UInt16(tagcolor.rawValue)    }    func addTagcolor(tagcolor : Tagcolors) -> Bool {        let bits : UInt16 = tagcolorValue(tagcolor) | self.getTagcolors()        return setTagcolors(bits)    }    func remTagcolor(tagcolor : Tagcolors) -> Bool {        let bits : UInt16 = ~tagcolorValue(tagcolor) & self.getTagcolors()        return setTagcolors(bits)    }    func setcolors(tagcolor : Tagcolors) -> Bool {        let bits : UInt16 = tagcolorValue(tagcolor)        return setTagcolors(bits)    }    func setTagcolors(colorMask : UInt16) -> Bool {        // get string for all available and requested bits        let arr = colorBitsToStrings(colorMask & (tagcolorValue(Tagcolors.Max)-1))        do {            try self.setResourceValue(arr,forKey: NSURLTagnamesKey)            return true        }        catch {            print("Could not write to file \(self.absoluteURL)")            return false        }    }    func getTagcolors() -> UInt16 {        return getAllTagcolors(self.absoluteURL)    }}// let initialBits: UInt8 = 0b00001111func colorBitsToStrings(colorMask : UInt16) -> NSArray {    // translate bits to (localized!) color names    let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!    // I don't kNow how to automate it for all languages possible!!!!    let colornames = countryCode as! String == "de" ? colornamesDE : colornamesEN    var tagArray = [String]()    var bitNumber : Int = -1   // ignore first loop    for colorname in colornames {        if bitNumber >= 0 {            if colorMask & UInt16(1<<bitNumber) > 0 {                tagArray.append(colorname)            }        }        bitNumber += 1    }    return tagArray}func getAllTagcolors(file : NSURL) -> UInt16 {    var colorMask : UInt16 = 0    // translate (localized!) color names to bits    let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!    // I don't kNow how to automate it for all languages possible!!!!    let colornames = countryCode as! String == "de" ? colornamesDE : colornamesEN    var bitNumber : Int = -1   // ignore first loop    var Tags : AnyObject?    do {        try file.getResourceValue(&Tags,forKey: NSURLTagnamesKey)        if Tags != nil {            let tagArray = Tags as! [String]            for colorname in colornames {                if bitNumber >= 0 {                    // color name Listed?                    if tagArray.filter( { 
enum Labelcolors: Int {    case none    case gray    case green    case purple    case blue    case yellow    case red    case orange    func label(using List: [String] = []) -> String? {        if List.isEmpty || List.count < 7 {            switch self {            case .none: return nil            case .gray: return "Gray\n1"            case .green: return "Green\n2"            case .purple: return "Purple\n3"            case .blue: return "Blue\n4"            case .yellow: return "Yellow\n5"            case .red: return "Red\n6"            case .orange: return "Orange\n7"            }        } else {            switch self {            case .none: return nil            case .gray: return List[0]            case .green: return List[1]            case .purple: return List[2]            case .blue: return List[3]            case .yellow: return List[4]            case .red: return List[5]            case .orange: return List[6]            }        }    }    static func set(colors: [Labelcolors],to url: URL,using List: [String] = []) throws    {        // 'setExtendedAttributeData' is part of https://github.com/billgarrison/SOExtendedAttributes        try (url as NSURL).setExtendedAttributeData(propertyListData(labels: colors,using: List),name: "com.apple.Metadata:_kMDItemUserTags")    }    static func propertyListData(labels: [Labelcolors],using List: [String] = []) throws -> Data    {        let labelStrings = labels.flatMap { 
do {    // default English label names    try Labelcolors.set(colors: [.yellow,.red],to: fileURL)    // localized label names    let List = Labelcolors.localizedLabelnames()    try Labelcolors.set(colors: [.green,.blue],to: fileURL,using: List)} catch {    print("Error when setting label color(s): \(error)")}
.label(using: List) } return try PropertyListSerialization.data(fromPropertyList: labelStrings,format: .binary,options: 0) } static func localizedLabelnames() -> [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]] { var List = [(Int,String)]() // with '.count == 2' we ignore non-system labels for item in fTags where item.values.count == 2 { if let name = item["n"] as? String,let number = item["l"] as? Int { List.append((number,name)) } } return List.sorted { .0 < .0 }.map { "\(.1)\n\(.0)" } } } return [] }}
== colorname } ).count > 0 { colorMask |= UInt16(1<<bitNumber) } } bitNumber += 1 } } } catch { // process the error here } return colorMask}
历史

首先是我之前的答案,它适用于将一个颜色标签设置为文件:https://stackoverflow.com/a/39751001/2227743.

然后@mz2发布了这个优秀的答案,成功地为文件设置了几个颜色标签并解释了这个过程:https://stackoverflow.com/a/40314367/2227743.

现在这个小插件,一个简单的follow-up到@ mz2的答案.

我只是简单地实现了@ mz2的建议:我已经使用获取Finder首选项的方法扩展了他的枚举示例,并在将属性设置到文件之前提取了正确的本地化标签颜色名称.

用法:

总结

以上是内存溢出为你收集整理的Swift 3:设置Finder标签颜色全部内容,希望文章能够帮你解决Swift 3:设置Finder标签颜色所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1051487.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存