按钮的背景未有条件呈现

时间:2019-12-25 01:28:48

标签: swift button swiftui

基本上,当我按下按钮时,我希望背景变成不同的颜色。为此,我有一个要更改的对象,我已在该对象中打印出布尔值的值,并查看其变化,但按钮的颜色没有变化。

带布尔对象:

class dummyObject: Identifiable, ObservableObject {
    let objectWillChange = ObservableObjectPublisher()
    var id = UUID()
    var isSelected: Bool {
        willSet {
            objectWillChange.send()
        }
    }

    init(isSelected:Bool) {
        self.isSelected = isSelected
    }
}

查看:

struct SelectionView: View {
    var objs: [dummyObject] = [
        dummyObject.init(isSelected: false)
    ]


    var body: some View {
        HStack{
            ForEach(objs) { obj in
                Button(action: {
                    obj.isSelected.toggle()
                    print("\(obj.isSelected)")
                }) {

                    VStack {
                        Text("Test")
                            .foregroundColor(obj.isSelected ? Color.white : Color.gray)
                            .font(.caption)
                    }
                }.frame(width:55,height: 55)
                .padding()
                .background(obj.isSelected ? Color.red : Color.white)
                    .padding(.horizontal, 3)
                .clipShape(Circle()).shadow(radius: 6)
            }
        }.frame(minWidth: 0, maxWidth: .infinity)
        .padding()
    }
}

2 个答案:

答案 0 :(得分:0)

在这里修改了可以工作的代码的快照。在Xcode 11.2 / iOS 13.2上进行了测试。

主要思想是使模型成为值类型,因此对属性的修改会修改模型本身,并在视图中引入@State会刷新更改。

struct dummyObject: Identifiable, Hashable {
    var id = UUID()
    var isSelected: Bool
}

struct SelectionView: View {
    @State var objs: [dummyObject] = [
        dummyObject(isSelected: false)
    ]

    var body: some View {
        HStack{
            ForEach(Array(objs.enumerated()), id: \.element) { (i, _) in
                Button(action: {
                    self.objs[i].isSelected.toggle()
                    print("\(self.objs[i].isSelected)")
                }) {

                    VStack {
                        Text("Test")
                            .foregroundColor(self.objs[i].isSelected ? Color.white : Color.gray)
                            .font(.caption)
                    }
                }.frame(width:55,height: 55)
                .padding()
                    .background(self.objs[i].isSelected ? Color.red : Color.white)
                    .padding(.horizontal, 3)
                .clipShape(Circle()).shadow(radius: 6)
            }
        }.frame(minWidth: 0, maxWidth: .infinity)
        .padding()
    }
}

答案 1 :(得分:0)

将您的Button提取到其他视图中,其中obj@ObservedObject,一切正常:

import SwiftUI
import Combine

class dummyObject: Identifiable, ObservableObject {
    let objectWillChange = ObservableObjectPublisher()
    var id = UUID()
    var isSelected: Bool {
        willSet {
            objectWillChange.send()
        }
    }

    init(isSelected:Bool) {
        self.isSelected = isSelected
    }
}

struct SelectionView: View {

    var objs: [dummyObject] = [dummyObject.init(isSelected: false)]

    var body: some View {
        HStack{
            ForEach(objs) { obj in
                ObjectButton(obj: obj)
            }
        }
    }
}

struct ObjectButton: View {

    @ObservedObject var obj: dummyObject

    var body: some View {
        Button(action: {
            self.obj.isSelected.toggle()
            print("\(self.obj.isSelected)")
        }) {

            VStack {
                Text("Test")
                    .foregroundColor(obj.isSelected ? Color.white : Color.gray)
                    .font(.caption)
            }
        }.frame(width:55,height: 55)
            .padding()
            .background(obj.isSelected ? Color.red : Color.white)
            .padding(.horizontal, 3)
            .clipShape(Circle()).shadow(radius: 6)
    }
}

struct SelectionView_Previews: PreviewProvider {
    static var previews: some View {
        SelectionView()
    }
}