Swiftui 取消选择列表行时的快捷方式操作

Swiftui 取消选择列表行时的快捷方式操作,swiftui,Swiftui,我有一个SwiftUI列表,可以更改行上的属性,例如,点击时的颜色。 现在,如果点击另一行,我想启动一个操作,例如重置颜色 我正在查找行接收的事件(如果取消选择) 下面是我的示例代码: struct ContentView: View { @State var data : [String] = ["first","second","third","4th","5th"] var body: some View { List { ForEach (data, id:

我有一个SwiftUI列表,可以更改行上的属性,例如,点击时的颜色。
现在,如果点击另一行,我想启动一个操作,例如重置颜色

我正在查找行接收的事件(如果取消选择)

下面是我的示例代码:

struct ContentView: View {
  @State var data : [String] = ["first","second","third","4th","5th"]
  var body: some View {
    List {
      ForEach (data, id: \.self) {
        item in
        ColoredRow(text: item)
      }
    }
  }
}

struct ColoredRow: View {
  var text: String = ""
  @State var col : Color = Color.white

  var body: some View{
    Text("\(text)")
    .background(col)
    .onTapGesture {
      self.col = Color.red
    }
//  .onDeselect {
//    print("disappeare \(self.text)")
//    self.col = Color.white
//  }
  }
}

让我们回想一下SwiftUI是被动的(即状态驱动的,而不是事件驱动的),所以如果我们不想改变UI中的某些东西,我们需要找到一种通过状态(UI或模型,但状态)来改变它的方法

所以,下面是对您的代码进行的轻微修改,以显示可能的方法。使用Xcode 11.2/iOS 13.2进行测试

struct ContentView: View {
    @State var data : [String] = ["first","second","third","4th","5th"]
    @State private var selectedItem: String? = nil
    var body: some View {
        List {
            ForEach (data, id: \.self) {
                item in
                ColoredRow(text: item, selection: self.$selectedItem)
            }
        }
    }
}

struct ColoredRow: View {
    var text: String = ""
    @Binding var selection: String?

    @State var col : Color = Color.white

    var body: some View{
        Text("\(text)")
            .background(selection == text ? Color.red : Color.white)
            .onTapGesture {
                self.selection = (self.selection == self.text ? nil : self.text)
        }
    }
}


谢谢!,如果我不传入文本,而是为
struct ColoredRow:View{@Binding var selected:String这样的内容传递一个闭包,有什么诀窍吗?让content:()->content
还是我必须传入文本作为行的额外“id”来进行比较?