Swiftui 取消选择列表行时的快捷方式操作
我有一个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:
现在,如果点击另一行,我想启动一个操作,例如重置颜色 我正在查找行接收的事件(如果取消选择) 下面是我的示例代码:
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”来进行比较?