首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*SwiftUI 7*如何使ForEach循环中的项处于活动状态

*SwiftUI 7*如何使ForEach循环中的项处于活动状态
EN

Stack Overflow用户
提问于 2019-09-14 19:42:01
回答 1查看 2.3K关注 0票数 1

我有一个类型的数据模型:

代码语言:javascript
复制
struct fruit: Identifiable{
    var id = UUID()
    var a: String
    var b: String
    var isActive: Bool
}

和一个数组:

代码语言:javascript
复制
let fruitData=[
    Model(a:"appleImg", b:"Apple", isActive: true),
    Model(a:"pearImg", b:"Pear", isActive: false),
    Model(a:"bananaImg", b:"Banana", isActive: false),
]

有一个看起来像这样的RowView:

代码语言:javascript
复制
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中循环了这个视图。所以,就像:

代码语言:javascript
复制
let fruits = fruitData
ForEach(fruits){fruitPiece in
    RowView(a:fruitPiece.a, b:fruitPiece.b, isActive: 
    fruitPiece.isActive)
}

我想根据用户对所选行的点击来改变isActive --它应该是一个选择,所以一次只有一个活动状态。对于SwiftUI来说仍然是新的,所以任何帮助都是非常感谢的:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-15 07:30:20

下面的代码按照您的要求执行。但是,首先对您的代码进行一些评论:

  1. 按照惯例,变量名不应以大写开头(如在let ModelArray中)。这会让人更难读懂。如果不是对你,对其他人。当共享代码时(例如在堆栈溢出中),请尝试遵循适当的约定。
  2. 您正在调用ForEach(models),但还没有定义模型数组(虽然创建了ModelArray )。
  3. 在您的ForEach中,您正在调用Model(...)。在ForEach内部,您需要一个视图来显示数据。但是在您的代码中,Model是一种数据类型。没有任何意义。

这是我想的代码,按你说的做。当您点击视图时,它的isActive标志会切换。为了显示它的工作原理,文本的颜色会相应地发生变化。

代码语言:javascript
复制
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 }
                    }
                }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57938710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档