SwiftUI自定义结构体数据无法修改预览背景颜色问题
问题:SwiftUI预览背景颜色未按预期显示黄色
我正在跟随苹果官方教程学习Swift与SwiftUI,遇到一个问题:预览的背景颜色没有按预期变成黄色。
代码展示
Theme.swift
import SwiftUI enum Theme: String { // ...其他枚举值 case yellow var accentColor: Color { switch self { case /* ...其他枚举值 */ .yellow: return .black // 为yellow主题声明强调色 case .indigo, .magenta, .navy, .oxblood, .purple: return .white } } var mainColor: Color { Color(rawValue) } }
DailyScrum.swift
import Foundation struct DailyScrum { var title: String var attendees: [String] var lengthInMinutes: Int var theme: Theme } extension DailyScrum { static let sampleData: [DailyScrum] = [ DailyScrum(title: "Design", attendees: ["Cathy", "Daisy", "Simon", "Jonathan"], lengthInMinutes: 10, theme: .yellow), // 为第一个示例数据指定yellow主题 // 其他示例数据 ] }
CardView.swift
import SwiftUI struct CardView: View { let scrum: DailyScrum var body: some View { Text("Hello, World!") } } struct CardView_Previews: PreviewProvider { static var scrum = DailyScrum.sampleData[0] // 获取第一个示例数据 static var previews: some View { CardView(scrum: scrum) .background(scrum.theme.mainColor) // 设置为该数据主题的主色 } }
问题现象
实际预览背景没有显示黄色,预期应该是黄色背景。但直接把scrum.theme.mainColor改成.yellow或者scrum.theme.accentColor时,背景颜色能正常显示。我的Xcode版本是15,Swift版本5.9.2。
解答
问题出在Theme枚举的mainColor实现上。Color(rawValue)用的是枚举的字符串值"yellow",但SwiftUI的这个初始化器是去**资产目录(Assets.xcassets)**里查找对应名称的颜色集,而非直接调用系统自带的.yellow颜色。
有两种解决方式:
直接映射系统颜色
修改mainColor的实现,通过switch返回对应系统颜色:var mainColor: Color { switch self { case .yellow: return .yellow // 补充其他主题对应的颜色映射 } }在资产目录中添加颜色集
如果想保留rawValue的写法,需要在Assets.xcassets里创建名为"yellow"的颜色集,设置好对应的黄色值,这样Color(rawValue)才能正确读取到颜色。
你测试用的.yellow是系统自带颜色,accentColor也是直接返回系统颜色,所以能正常显示;而mainColor依赖资产目录中的自定义颜色,没创建的话自然没有效果。
内容的提问来源于stack exchange,提问作者dbx
相关产品推荐
相关产品推荐

