有没有办法改变几行代码,所以所有的三元表达式都会跟随? [复制]

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)
        
    

【讨论】:

以上是关于有没有办法改变几行代码,所以所有的三元表达式都会跟随? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

无赋值的 Java 三元

if/else 三元表达式中的 def

是否可以在三元表达式上只放置一个选项?

运行多于一行代码的角三元表达式

替换 PL/SQL 中的几行正则表达式函数

有没有办法用 CSS 将长数字(“$100000000”)分解成更易读的三元组(“$100 000 000”)?