【问题标题】:Swiftui Button image not changing on clicking until i click on another buttonSwiftui 按钮图像在单击时不会更改,直到我单击另一个按钮
【发布时间】:2022-01-08 17:03:59
【问题描述】:

我知道有人已经问过类似的问题,但我仍然没有解决问题。

我有一个带有 2 个按钮的 HStack,点击后会更改图像。在单击另一个按钮之前,第一个按钮不会在单击时更改,第二个按钮会正确更新。两个按钮的区别在于第一个按钮的动作取决于变量“museum.favorite”,该变量是博物馆类的变量。第二个更新取决于变量 b 的值,这是在同一视图中声明的状态变量。

过去几天我一直坚持这一点,如果有人知道背后的原因和解决方法,我将不胜感激。我希望按钮根据“museum.favorite”的值更新的原因是因为我发现如果我根据在同一视图中声明的状态变量进行更新(将变量作为参数传递也不起作用),那么在我切换到另一个视图后,图像很快又变回了默认值(“heart”而不是“heart.fill”)。

这是代码,提前谢谢!:

    
    var museum:Museum
    @State var a = false
    @State var b = false
    
    var body: some View {
        HStack {
            Button {
                museum.favorite.toggle()
            } label: {
                Image(systemName: museum.favorite == true ? "heart.fill" : "heart")
            }
            Button {
                b.toggle()
            } label: {
                Image(systemName: b == true ? "star.fill" : "star")
            }
        }
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        let model = MuseumModel()
        Test(museum: model.museums[0])
    }
}

【问题讨论】:

  • 如果博物馆是一个类,就像你说的那样,它需要是一个 ObservableObject 并且收藏夹需要是一个 @Published 属性。
  • 我已经尝试过了,但是将@Published 添加到收藏夹会得到错误:“类型'Museum'不符合协议'Decodable'”。类博物馆被声明为 --> 类博物馆:可识别、可解码、可观察对象 {}。我该如何解决这个问题?
  • 欢迎来到 Stack Overflow!请拨打tour 并查看:How do I ask a good question?How to create a Minimal, Reproducible Example。这是一个需要一个最小的、可重现的例子的经典例子。

标签: ios button swiftui


【解决方案1】:

最后,我找到了一种更简单的方法。 在HStack 处,添加.onAppear{} 并进行条件检查,以便图像在不同视图中自行更新。

    import SwiftUI
    
    struct buttons: View {
        
        var museum:Museum
        @State var visitIcon = "figure.walk.circle"
        @State var heart = "heart"
        
        var body: some View {
            HStack(spacing:60){
                    Button(action: {
                        museum.visited.toggle()
                        if(museum.visited){
                            visitIcon = "figure.walk.circle.fill"
                        }
                        else{
                            visitIcon = "figure.walk.circle"
                        }
                    }, label: {
                        VStack{
                            Image(systemName:visitIcon).resizable()
                                    .frame(width: 20, height: 20).foregroundColor(.black)
                            
                            Text("Visited").foregroundColor(.black)
                        }
                    })
                    Button(action: {
                        museum.favorite.toggle()
                        if(museum.favorite){
                            heart = "heart.fill"
                        }
                        else{
                            heart = "heart"
                        }
                    }, label: {
                    
                        VStack{
                            Image(systemName:heart).resizable()
                                .frame(width: 20, height: 20).foregroundColor(.black)
                            Text("Favorite").foregroundColor(.black)
                        }
                    })
            }.onAppear {
                if(museum.favorite){
                    visitIcon = "figure.walk.circle.fill"
                }
                else{
                    visitIcon = "figure.walk.circle"
                }
                if(museum.favorite){
                    heart = "heart.fill"
                }
                else{
                    heart = "heart"
                }
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多