首页 > 解决方案 > 如何更改此“布尔”,然后在其他地方使用更新后的值?

问题描述

所以我在这里创建了这个列表。我的目标是更改 的状态,Bool以便稍后我可以在点击时更改背景颜色。我做不到。它仍然给我false

struct prayerTimesImages: Identifiable {
    var id = UUID()
    var name: String
    var isActive: Bool
}

struct TodayView: View {
    @State var prayerTimesImage = [
        prayerTimesImages(name: "Fajr", isActive: false),
        prayerTimesImages(name: "Zuhr", isActive: false),
        prayerTimesImages(name: "Asr", isActive: false),
        prayerTimesImages(name: "Maghrib", isActive: false),
        prayerTimesImages(name: "Isha", isActive: false)]
VStack {
                                    ForEach(prayerTimesImage, id: \.id) {prayerIcon in
                                        Button(action: {}) {
// HS -- Content of Button
                                            HStack {
                                                Image(prayerIcon.name)
                                                    .resizable()
                                                    .aspectRatio(contentMode: .fit)
                                                    .frame(width: 50, height: 50)
                                                Text("\(prayerIcon.name)")
                                                Spacer()
                                            }
                                            .padding(.horizontal, 5)
                                            .padding(.vertical, 10)
                                            .background(prayerIcon.isActive ? Color.green : Color.white)
                                            //.scaleEffect(longPressed ? 0.98 : 1)
                                            .onLongPressGesture(minimumDuration: 1) {
                                                prayerIcon.isActive = true
                                                print(prayerIcon.isActive)
                                            }
                                            
                                        }.cornerRadius(10)
                                        .shadow(radius: 2)}
                                        .font(.system(.headline))
                                        .foregroundColor(.black)
                            }
                        }.frame(width: totalWidth, alignment: .center)

标签: swiftswiftuistate

解决方案


由于我无法在图像中复制/粘贴代码,因此我必须比我想的要精确一些。

问题 #1:您不能@State在非View. 编译器可能会让你这样做,但它不会正常工作。更改@State var activevar active

问题#2var prayerTimesImage需要@State var prayerTimesImage

问题 #3:您需要有一个索引,以便您可以修改prayerTimesImage数组:

ForEach(Array(prayerTimesImage.enumerated(), id: \.1.id) { (index, prayerIcon) in 

然后在你的onLongPressGesture

var copiedIcon = prayerIcon
copiedIcon.isActive = true
prayerTimesImage[index] = copiedIcon

无法测试,因为我无法复制代码,但 * 应该 * 处理好所有事情。

推荐阅读