我有一个类型的数据模型:
struct fruit: Identifiable{
var id = UUID()
var a: String
var b: String
var isActive: Bool
}和一个数组:
let fruitData=[
Model(a:"appleImg", b:"Apple", isActive: true),
Model(a:"pearImg", b:"Pear", isActive: false),
Model(a:"bananaImg", b:"Banana", isActive: false),
]有一个看起来像这样的RowView:
struct RowView{
var a = "appleImg"
var b = "Apple"
var isActive = true
var body: some View{
HStack(spacing:8){
Image(a)
Text(b)
Spacer()
}
}
}然后,我在主视图中创建了一个使用ModelArray的视图,并在ForEach中循环了这个视图。所以,就像:
let fruits = fruitData
ForEach(fruits){fruitPiece in
RowView(a:fruitPiece.a, b:fruitPiece.b, isActive:
fruitPiece.isActive)
}我想根据用户对所选行的点击来改变isActive --它应该是一个选择,所以一次只有一个活动状态。对于SwiftUI来说仍然是新的,所以任何帮助都是非常感谢的:)
发布于 2019-09-15 07:30:20
下面的代码按照您的要求执行。但是,首先对您的代码进行一些评论:
let ModelArray中)。这会让人更难读懂。如果不是对你,对其他人。当共享代码时(例如在堆栈溢出中),请尝试遵循适当的约定。ForEach(models),但还没有定义模型数组(虽然创建了ModelArray )。Model(...)。在ForEach内部,您需要一个视图来显示数据。但是在您的代码中,Model是一种数据类型。没有任何意义。这是我想的代码,按你说的做。当您点击视图时,它的isActive标志会切换。为了显示它的工作原理,文本的颜色会相应地发生变化。
struct Model: Identifiable {
var id = UUID()
var a: String
var b: String
var c: String
var isActive: Bool
}
struct ContentView: View {
@State private var modelArray = [
Model(a:"hi", b:"I like", c: "potatoes", isActive: true),
Model(a:"hi", b:"I like", c: "potatoes", isActive: false),
Model(a:"hi", b:"I like", c: "potatoes", isActive: false),
]
var body: some View {
ForEach(modelArray.indices, id: \.self){ idx in
Text("\(self.modelArray[idx].a) \(self.modelArray[idx].b) \(self.modelArray[idx].c)")
.foregroundColor(self.modelArray[idx].isActive ? .red : .green)
.onTapGesture {
self.modelArray[idx].isActive = true
for i in self.modelArray.indices {
if i != idx { self.modelArray[i].isActive = false }
}
}
}
}
}https://stackoverflow.com/questions/57938710
复制相似问题