json - 如何使用 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")
}
}
问题:我必须对代码进行哪些更改才能使其正常工作?
解决方案
我相信您可以尝试声明一个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")
}
}
推荐阅读
- sql-server-2012 - 分组计数的运行总计
- node.js - Express JS Web 应用程序上的用户登录和身份验证
- python - Python/Tkinter - 将按钮状态写入文件以在下次启动时自动重新应用?
- javascript - 通过 JavaScript 分配 div 的宽度和高度时,边框不工作?
- git - git给出关于在cmd中运行vim的错误
- javascript - 任何人都可以解释 node.js 中的请求库吗?
- php - 重写路由关闭 301 重定向到 Laravel 中的控制器
- javascript - 两个数组是同步变化的,可能是VUE的一个bug
- java - 过滤机会枚举并根据随机机会选择一个
- vue.js - vue jsx组件的“数据未定义”