有没有办法改变几行代码,所以所有的三元表达式都会跟随? [复制]
Posted
技术标签:
【中文标题】有没有办法改变几行代码,所以所有的三元表达式都会跟随? [复制]【英文标题】:Is there a way to change a few lines of code so all the ternary expression would follow? [duplicate] 【发布时间】:2021-06-01 23:58:21 【问题描述】:我有以下代码来构建一个包含许多 Text()
的视图,它们都遵循相同的 foregroundColor
语句:
struct myView: View
@Binding var darkMode: Bool
var body: some View
Text(...)
.foregroundColor(darkMode ? Color.white : Color.gray)
...
Text(...)
.foregroundColor(darkMode ? Color.white : Color.gray)
...
Text(...)
.foregroundColor(darkMode ? Color.white : Color.gray)
...
Text(...)
.foregroundColor(darkMode ? Color.white : Color.gray)
...
// more Text() using the same statement of .foregroundColor
...
我这里有个问题。例如,如果我想使用Color.blue
更改darkMode
,我必须在此视图中更改Text()
的所有.foregroundColor()
。可能有 20-30 个地方,也许我会错过一个。
有没有办法更改几行“集中”代码,以便所有Text().foregroundColor()
都跟随?
PS。我的问题中的示例是一个简化的示例。除了Text()
,我还有其他使用darkMode
来决定颜色的视图。此外,还有基于darkMode
的不同视图的其他颜色组合。因此,我正在寻找自定义视图以外的其他解决方案。谢谢。
我实现这一点的直观方法是使用一个变量来保存该值,如下所示:
var myColor = darkMode ? Color.white : Color.gray
但是如果我把它放在结构定义中,这会产生编译器错误。我在这里提出的问题是尝试为此找到一些解决方法。
【问题讨论】:
为您的应用创建一个自定义的Text
视图。
没有View
我在下面添加了答案
您应该在资产目录中使用颜色资产来存储这些颜色。如果您提供深色和浅色模式变体,系统会自动为您选择它们。
@Alexander 在 UIKit 中,还可以形成一个 UIColor 以编程方式表现。我不知道 SwiftUI 颜色。
【参考方案1】:
foregroundColor
修饰符应用于它所在视图的整个树。您可以将所有文本元素包装在一个组中,并将foregroundColor
添加到组中。
struct MyView: View
@Binding var darkMode: Bool
var body: some View
Group
Text(...)
Text(...)
...
.foregroundColor(darkMode ? Color.white : Color.gray)
不一定是Group
。它可以是VStack
、自定义视图或任何类型的视图。如果您想将前景色应用到整个应用程序,您可以将foregroundColor
添加到您的App
的根视图中:
@main
struct MyApp: App
@Environment(\.colorScheme) var colorScheme
var body: some Scene
WindowGroup
NavigationView
...
.foregroundColor(colorScheme == .dark ? Color.white : Color.gray)
【讨论】:
以上是关于有没有办法改变几行代码,所以所有的三元表达式都会跟随? [复制]的主要内容,如果未能解决你的问题,请参考以下文章