如果没有颜色名称则不显示颜色 (SwiftUI)
Do not display a color if there is no color name (SwiftUI)
我从 Model() 中获取图片的框架颜色名称,我从 colorSet 中获取颜色
struct Model: Identifiable {
let id = UUID()
let image: String
let colorSet: String
}
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: "")
]
}
}
但是如果 colorSet 没有颜色名称因为不需要它,我会得到一个错误
如何实现如果颜色名称不在 colorSet 中,则不显示任何内容
完整代码
struct Model: Identifiable {
let id = UUID()
let image: String
let colorSet: String
}
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: "")
]
}
}
struct Im: View {
let model = Model.AllModel()
var body: some View {
HStack {
ForEach(model) { model in
CellView(model: model)
}
}
}
}
struct CellView: View {
let model: Model
var body: some View {
Image(systemName: model.image)
.resizable()
.scaledToFit()
.frame(width: 40, height: 40)
.padding()
.overlay(RoundedRectangle(cornerRadius: 9)
.stroke(Color(model.colorSet), lineWidth: 5))
}
}
明确一点:
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: "CLEAR")
]
}
}
像这样设置“CLEAR”颜色集:
结果,你会得到这个:
编辑:
由于您还在图标下方显示了颜色的名称,因此您需要做的就是使用三元组查看是否 colorSet == "CLEAR"
然后用空字符串替换它,如下所示:
struct CellView: View {
let model: Model
var body: some View {
VStack {
Image(systemName: model.image)
.resizable()
.scaledToFit()
.frame(width: 40, height: 40)
.padding()
.overlay(RoundedRectangle(cornerRadius: 9)
.stroke(Color(model.colorSet), lineWidth: 5))
// Put a ternary in the Text() to test whether you have "CLEAR"
Text(model.colorSet == "CLEAR" ? "" : model.colorSet)
}
}
}
我会让你的模型更丰富,让你的视图更简单
struct Model: Identifiable {
let id = UUID()
let image: String
let colorSet: String? // optional named color
}
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: nil)
]
}
// Computed property for the color
var borderColor: Color {
guard let colorSet = colorSet else {
return .clear
}
return Color(colorSet)
}
// and e.g. for a name for showing in the UI
var uiName: String {
guard let colorSet = colorSet else {
return "None"
}
return colorSet
}
}
那么你的观点就变成了
struct CellView: View {
let model: Model
var body: some View {
Image(systemName: model.image)
.resizable()
.scaledToFit()
.frame(width: 40, height: 40)
.padding()
.overlay(
RoundedRectangle(cornerRadius: 9)
.stroke(model.borderColor, lineWidth: 5)
)
}
}
与文本类似,名称的格式设置为在模型中显示,而不是在视图中显示。
我从 Model() 中获取图片的框架颜色名称,我从 colorSet 中获取颜色
struct Model: Identifiable {
let id = UUID()
let image: String
let colorSet: String
}
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: "")
]
}
}
但是如果 colorSet 没有颜色名称因为不需要它,我会得到一个错误
如何实现如果颜色名称不在 colorSet 中,则不显示任何内容
完整代码
struct Model: Identifiable {
let id = UUID()
let image: String
let colorSet: String
}
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: "")
]
}
}
struct Im: View {
let model = Model.AllModel()
var body: some View {
HStack {
ForEach(model) { model in
CellView(model: model)
}
}
}
}
struct CellView: View {
let model: Model
var body: some View {
Image(systemName: model.image)
.resizable()
.scaledToFit()
.frame(width: 40, height: 40)
.padding()
.overlay(RoundedRectangle(cornerRadius: 9)
.stroke(Color(model.colorSet), lineWidth: 5))
}
}
明确一点:
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: "CLEAR")
]
}
}
像这样设置“CLEAR”颜色集:
结果,你会得到这个:
编辑:
由于您还在图标下方显示了颜色的名称,因此您需要做的就是使用三元组查看是否 colorSet == "CLEAR"
然后用空字符串替换它,如下所示:
struct CellView: View {
let model: Model
var body: some View {
VStack {
Image(systemName: model.image)
.resizable()
.scaledToFit()
.frame(width: 40, height: 40)
.padding()
.overlay(RoundedRectangle(cornerRadius: 9)
.stroke(Color(model.colorSet), lineWidth: 5))
// Put a ternary in the Text() to test whether you have "CLEAR"
Text(model.colorSet == "CLEAR" ? "" : model.colorSet)
}
}
}
我会让你的模型更丰富,让你的视图更简单
struct Model: Identifiable {
let id = UUID()
let image: String
let colorSet: String? // optional named color
}
extension Model {
static func AllModel() -> [Model] {
return [
//1
Model(image: "folder", colorSet: "YELLOW"),
//2
Model(image: "folder.fill", colorSet: nil)
]
}
// Computed property for the color
var borderColor: Color {
guard let colorSet = colorSet else {
return .clear
}
return Color(colorSet)
}
// and e.g. for a name for showing in the UI
var uiName: String {
guard let colorSet = colorSet else {
return "None"
}
return colorSet
}
}
那么你的观点就变成了
struct CellView: View {
let model: Model
var body: some View {
Image(systemName: model.image)
.resizable()
.scaledToFit()
.frame(width: 40, height: 40)
.padding()
.overlay(
RoundedRectangle(cornerRadius: 9)
.stroke(model.borderColor, lineWidth: 5)
)
}
}
与文本类似,名称的格式设置为在模型中显示,而不是在视图中显示。