SwiftUI Sheet 不更新变量

标签 swift swiftui

如果我通过选择另一个项目来更改值,我会尝试将一个项目传递到工作表。即使我从未使用第一项调用工作表,工作表仍会继续显示第一项。

这是一个错误还是我做错了什么?

锻炼列表.swift

import SwiftUI

struct WorkoutList: View {
    private var workouts = workoutData
    @State var showWorkoutDetails = false

    var body: some View {
        ScrollView(.horizontal, showsIndicators: false) {
            HStack(spacing: 20) {
                ForEach(workouts) { workoutCard in
                    GeometryReader { geometry in
                        Button(action: {self.showWorkoutDetails.toggle()}) {
                            WorkoutCardView(workout: workoutCard)
                                .rotation3DEffect(Angle(degrees: Double((geometry.frame(in: .global).minX - 30) / -30)), axis: (x: 0, y: 10, z: 0))
                                .sheet(isPresented: self.$showWorkoutDetails) {
                                    WorkoutDetails(workout: workoutCard)
                                }
                        }
                    }
                    .frame(width:246, height: 360)

                }
            }
        .padding(30)
        }
    }
}

private let workoutData = [
    Workout(name: "Workout #1", imageName: "workoutImage", color: Color.orange),
    Workout(name: "Workout #2", imageName: "workoutImage", color: Color.green),
    Workout(name: "Workout #3", imageName: "workoutImage", color: Color.red),
    Workout(name: "Workout #4", imageName: "workoutImage", color: Color.blue)
]

锻炼详情.swift

import SwiftUI

struct WorkoutDetails: View {
    var workout = Workout(name: "", imageName: "", color: Color.black)

    var body: some View {
        GeometryReader { geometry in
            ZStack {
                Rectangle()
                    .fill(self.workout.color)

                VStack(alignment: .leading) {
                    VStack(alignment: .leading) {
                        Text(self.workout.name)
                            .foregroundColor(.white)
                            .font(.title)
                            .fontWeight(.heavy)
                            .lineLimit(nil)
                            .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                            .frame(height: 70)
                    }
                    .frame(width: 180)

                    Image(self.workout.imageName)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: geometry.size.width-60, height: 200)
                        .padding()

                    Spacer()
                }
                .padding(.top, 40)
                .padding(.leading, 10)
            }
        }
        .edgesIgnoringSafeArea(.bottom)
    }
}

在这里我想显示一个锻炼。但无论我如何改变它,我总是得到“锻炼#1”,而且我不知道我做错了什么。

最佳答案

创建带有可选锻炼的绑定(bind)。 Nil 表示不显示工作表,将锻炼分配给该变量会显示相应的工作表。

struct WorkoutList: View {
  private var workouts = workoutData
  @State var selectedWorkout: Workout?

  var body: some View {
    ScrollView(.horizontal, showsIndicators: false) {
      HStack(spacing: 20) {
        ForEach(workouts) { workoutCard in
          GeometryReader { geometry in
            Button(action: { self.selectedWorkout = workoutCard }) {
              WorkoutCardView(workout: workoutCard).rotation3DEffect(Angle(degrees: Double((geometry.frame(in: .global).minX - 30) / -30)), axis: (x: 0, y: 10, z: 0)).sheet(item: self.$selectedWorkout) { workout in
                WorkoutDetails(workout: workout)
              }
            }
          }.frame(width:246, height: 360) 
        }
      }.padding(30)
    }
  }
}

关于SwiftUI Sheet 不更新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59957149/

相关文章:

ios - 如何通过 UIButton Swift 传递 Int64/Int32 值

SwiftUI Tabbar 在选项卡的 View 中保留 navigationBarTitle 位置

VStack 中大 Text 和 TextField 之间的 SwiftUI 神秘间距

swift - 我可以在 SwiftUI 中使用颜色文字吗

swift - 如果我必须在 Swift 中使目标对象保持事件状态,如何抑制 "variable was never used"警告?

ios - 如何在 Swift 中实现 UIPageControl

ios - 如何让pickerView水平滚动?

swift - Swift 中的协议(protocol)见证表和 vtable 有什么区别?

ios - 从底部向上布局 SwiftUI 列表单元格

ios - 如何在 SwiftUI 中自动检测 NavigationBarTitle displayMode 变为 .inline 或 .large?