SwiftData的EntryModel如何设置类型关联颜色并在视图展示?
问题
我的应用中有一个UserModel,它包含一个EntryModel数组。所有条目类型拥有相同属性,但我需要区分不同的特定条目类型,使其自动匹配对应颜色,并在全应用中始终以各自颜色展示。
目前我已完成以下内容:
@Model class EntryModel { var who: UserModel var what: String var note: String @Attribute(.externalStorage) var image: [Data]? var when: Date = Date.now }
最初我在同一文件中、类外部声明了一个单独的枚举,将条目类型划分为不同案例并返回自定义颜色:
enum EntryType: String, CaseIterable, Identifiable, Codable { case appointment = "appointment" case measurement = "measurement" var color: Color { switch self { case .appointment: return Color.customOrange case .measurement: return Color.customPurple } } }
之后我创建了Entry视图,但无法显示自定义颜色。
我的两个问题如下:
- 如何让每个
EntryModel指定特定条目类型并获取其对应的颜色? - 如何将这些颜色关联到展示条目的视图上?
解答
1. 给EntryModel绑定条目类型并获取对应颜色
在EntryModel中添加EntryType类型的属性,利用SwiftData对Codable枚举的支持,直接把类型字段加入模型:
@Model class EntryModel { var who: UserModel var what: String var note: String @Attribute(.externalStorage) var image: [Data]? var when: Date = Date.now // 新增条目类型属性,可设置默认值,创建条目时也可指定具体类型 var type: EntryType = .appointment }
现在每个EntryModel实例都有了专属的类型标识,通过entry.type.color就能直接拿到对应的自定义颜色。
2. 在视图中关联颜色展示
在Entry视图里,直接通过entry.type.color给UI元素设置颜色即可,确保全应用颜色统一:
struct EntryView: View { let entry: EntryModel var body: some View { VStack(alignment: .leading, spacing: 4) { Text(entry.what) .font(.headline) .foregroundColor(entry.type.color) Text(entry.note) .font(.subheadline) .foregroundColor(.secondary) Text(entry.when.formatted(date: .abbreviated, time: .shortened)) .font(.caption) .foregroundColor(.tertiary) } .padding() .background(entry.type.color.opacity(0.1)) .cornerRadius(8) .overlay( RoundedRectangle(cornerRadius: 8) .stroke(entry.type.color, lineWidth: 1) ) } }
上述示例中,标题文字、背景色、边框色都关联了条目类型对应的颜色,你可以根据需求调整需要上色的UI元素。
另外要确保自定义颜色已正确扩展:
extension Color { static let customOrange = Color(red: 1.0, green: 0.55, blue: 0.0) static let customPurple = Color(red: 0.55, green: 0.0, blue: 1.0) }
内容的提问来源于stack exchange,提问作者user30115770
相关产品推荐
相关产品推荐

