【问题标题】:Change Text color on tap in SwiftUI在 SwiftUI 中点击更改文本颜色
【发布时间】:2022-01-01 12:50:47
【问题描述】:

我通过以下方式在 SwiftUI 中定义了 ListText

struct SampleView: View {
    private let list: [String] = ["Tapping each line should change its color from grey to black", "First Line", "Second Line", "Third Line."]
    
    var body: some View {
        ScrollViewReader { value in
            List {
                ForEach(Array(zip(list, list.indices)), id: \.0) { eachString, index in
                    Text(eachString)
                        .bold().font(.largeTitle)
                        .foregroundColor(.gray)
                        .onTapGesture {
                            self.foregroundColor(.black)
                        }
                }
            }.listStyle(.plain)
        }.frame(maxHeight: .infinity)
    }
}

struct SampleView_Preview: PreviewProvider {
    static var previews: some View {
        SampleView()
    }
}

我需要能够在用户点击时更改特定 TextView 的 foregroundColor

CustomString 是我定义的符合Hashable 的类。我无法让它同时符合ObservableObject,这意味着我无法在onTapGesture 块内更改它的值。

我也无法从循环中删除 index,因为我也需要它。

TIA。

【问题讨论】:

标签: ios swift xcode swiftui textview


【解决方案1】:

不要把它看成个人的,只要记住 Stackoverflow 是一种在开发人员之间共享的好方法,但所有基础知识在来自 Apple 的文档和示例中都更加清晰。顺便说一句,他们做得非常好。

https://developer.apple.com/tutorials/swiftui

对于你的问题,你必须用你的颜色声明一个状态变量,所以当颜色改变时,视图会重新生成。

我没有测试你的代码,因为你没有提供复制/粘贴准备运行游乐场或视图类,但你看到了原理。

一个确定的事情是,如果您需要每个文本单元格独立更新,您应该制作一个“TextCell”子视图或其他任何东西,它有自己的颜色。不在最高级别。在您的代码中,我假设所有单元格都将获得相同的颜色,因为它是在您的列表的顶层定义的。

新年快乐:)

...
@State var color: Color = .gray

var myString: [CustomString]
...

ScrollViewReader { value in
    List {
        ForEach(Array(zip(myString, myString.indices)), id: \.0) { eachString, index in
        Text(eachString.text)
        .foregroundColor(color)
        .onTapGesture {
            self.color = .black
        }
    }
}

【讨论】:

  • 感谢您的意见。我已经更新了我的问题,以使其具有最低限度的可重复性。我还尝试了您的解决方案,但不幸的是没有奏效。创建一个@State 变量会在此之前更改所有其他TextView 的颜色。所有这些Text 实际上都是在ForEach 循环中创建的。
  • 这是我的回答所预料的。我写道,您需要在您自己的包含文本的自定义视图中移动 @State,并在循环中使用它。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多