首页 > 解决方案 > 如何使用 UIButton 正确切​​换 JSON 颜色?

问题描述

问题:我有 JSON 文件,其中包含一些颜色的名称和值(例如:“aliceblue”:[240、248、255、1]、“antiquewhite”:[250、235、215、1]、“aqua”: [0、255、255、1] 等)。我正在尝试解码这个并在按当前顺序按下按钮后将颜色值应用于背景颜色。如果 Xcode 解码文件的顺序,例如 4、9、1... 和颜色必须苹果在 oder 4、9、1...,我想。但是当我按下按钮时,颜色会完全随机变化(有些颜色可能会连续变化几次)。部分代码:

 @IBAction func changeColor(_ sender: UIButton) {
    
    let path = Bundle.main.path(forResource: "colors",
                                     ofType: "json")
    let url = URL(fileURLWithPath: path!)
    
    do {
        let data = try Data(contentsOf: url)
        let colors: [String:[Int]] = try JSONDecoder()
                                         .decode([String:[Int]].self,
                                                  from: data)
        
        for i in colors.enumerated() {
            
            print(i.element.key)
            let rgbaArray = colors[i.element.key]
            let r = CGFloat(rgbaArray![0]) / 255
            let g = CGFloat(rgbaArray![1]) / 255
            let b = CGFloat(rgbaArray![2]) / 255
            let a = CGFloat(rgbaArray![3])
            
            label.text = i.element.key
            
            self.view.backgroundColor = UIColor(red: r,
                                              green: g,
                                               blue: b,
                                              alpha: a)
        }
    } catch {
        print("Error")
    }    
}

问题:我必须对代码进行哪些更改才能使其正常工作?

标签: jsonswiftloopsuikitdecode

解决方案


我相信您可以尝试声明一个struct, 对应于您的实际数据结构,然后使用标准Codable协议。结构可以是这样的:

struct Color: Codable {
    var name: String
    var values: [Int]
}

稍后在您的代码中尝试这样的操作:

@IBAction func changeColor(_ sender: UIButton) {
    
    let path = Bundle.main.path(forResource: "colors",
                                     ofType: "json")
    let url = URL(fileURLWithPath: path!)
    
    do {
        let data = try Data(contentsOf: url)
        let colors = try JSONDecoder().decode([Color].self,
                                 from: data)
        
        for color in colors {
            
            let r = CGFloat(color.values[0]) / 255
            let g = CGFloat(color.values[1]) / 255
            let b = CGFloat(color.values[2]) / 255
            let a = CGFloat(color.values[3])
            
            
            self.view.backgroundColor =
                                    UIColor(red: r,
                                          green: g,
                                           blue: b,
                                          alpha: a)
        }
    } catch {
        print("Error")
    }
}

推荐阅读