如何切换数组中对象的属性并更新 SwiftUI 视图?

Posted

技术标签:

【中文标题】如何切换数组中对象的属性并更新 SwiftUI 视图?【英文标题】:How can I toggle a property of an object in an array and update the SwiftUI view? 【发布时间】:2020-05-16 20:33:04 【问题描述】:

SwiftUI 问题。我的这段代码给了我错误“编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式”。错误是因为 feel.selected.toggle()。 myFeelings 是一个 ObservableObject 类,它包含一个结构体的感觉数组。我希望能够在按下按钮并更新视图时将选定的属性更改为 true 或 false。我不知道是否有人可以帮助我,我一般是编码新手。

ForEach(myFeelings.feelings.indices)  index in
                    ZStack 
                        Button(action: 
                            self.myFeelings.feelings[index].selected.toggle()
                            print("A")
                        ) 
                            Text(self.myFeelings.feelings[index].emoji)
                                .font(.system(size: 40))
                        
                        Text(String(self.myFeelings.feelings[index].selected))
                        .font(.system(size: 10))
                    
                

这是我想用所选感受更新的部分。

ForEach(myFeelings.feelings.indices)  index in
                        Group 
                            if self.myFeelings.feelings[index].selected 
                            ZStack 

                                        Rectangle()
                                        .frame(height: 100)
                                            .foregroundColor(self.myFeelings.feelings[index].color)
                                        .scaledToFill()
                                    

                            
                        

                    

这是数组:

    @State var myFeelings = Feelings(feelings:[Feeling(feeling: "Joy", emoji: "????", color:  Color(#colorLiteral(red: 0.9607843137254902, green: 0.7058823529411765, blue: 0.2, alpha: 1.0))),
        Feeling(feeling: "Trust", emoji: "????", color: Color(#colorLiteral(red: 0.4666666666666667, green: 0.7647058823529411, blue: 0.26666666666666666, alpha: 1.0))),
        Feeling(feeling: "Fear", emoji: "????", color: Color(#colorLiteral(red: 0.27450980392156865, green: 0.48627450980392156, blue: 0.1411764705882353, alpha: 1.0))),
        Feeling(feeling: "Surprise", emoji: "????", color: Color(#colorLiteral(red: 0.12941176470588237, green: 0.21568627450980393, blue: 0.06666666666666667, alpha: 1.0))),
        Feeling(feeling: "Sadness", emoji: "????", color: Color(#colorLiteral(red: 0.17647058823529413, green: 0.4980392156862745, blue: 0.7568627450980392, alpha: 1.0))),
        Feeling(feeling: "Disgust", emoji: "????", color: Color(#colorLiteral(red: 0.12156862745098039, green: 0.011764705882352941, blue: 0.4235294117647059, alpha: 1.0))),
        Feeling(feeling: "Anger", emoji: "????", color: Color(#colorLiteral(red: 0.7450980392156863, green: 0.1568627450980392, blue: 0.07450980392156863, alpha: 1.0))),
        Feeling(feeling: "Anticipation", emoji: "????", color: Color(#colorLiteral(red: 0.9372549019607843, green: 0.34901960784313724, blue: 0.19215686274509805, alpha: 1.0)))])

感觉和感觉是结构

【问题讨论】:

【参考方案1】:

在你的 foreach 中使用 indices,并用 @State 声明 myFeelings,这是一个完整的工作示例:

struct FeelingGroup 
    var feelings: [Feeling]


struct Feeling 
    var selected: Bool
    var emoji: String

struct ToggleView: View 
    @State var myFeelings = FeelingGroup(feelings: [Feeling(selected: true, emoji: "A"),
                                                    Feeling(selected: true, emoji: "B"),
                                                    Feeling(selected: false, emoji: "C")])
    var body: some View 
        VStack
            ForEach(myFeelings.feelings.indices)  index in
                HStack 
                    Button(action: 
                        self.myFeelings.feelings[index].selected.toggle()
                        print("A")
                    ) 
                        Text(self.myFeelings.feelings[index].emoji)
                            .font(.system(size: 40))
                    
                    Text(String(self.myFeelings.feelings[index].selected))
                    .font(.system(size: 40))
                
            
        
    


struct ToggleView_Previews: PreviewProvider 
    static var previews: some View 
        ToggleView()
    

【讨论】:

谢谢,这会消除错误但不会更新视图。我需要更新视图以在我拥有的另一个 forEach 中显示数组中选定的感受。 您对第二个 ForEach 的期望是什么?如果您只是想展示一些东西,请尝试将 Group 替换为 VStackHStack

以上是关于如何切换数组中对象的属性并更新 SwiftUI 视图?的主要内容,如果未能解决你的问题,请参考以下文章

在内容视图 SwiftUI 中更新对象数组

属性更改时 Observable 不更新列表

SwiftUI - 如何切换核心数据中的所有布尔值

如何在切换 SwiftUI 中使用 json 属性?

如何在 SwiftUI 中触发状态更改/重绘切换更改

如何在带有 swiftUI 列表的切换中使用 json 属性?