ユーザーがルーチンに含めたいリストからエクササイズを選択するメニューがあります。これらの演習は、対話に関するシートがポップアップ表示される LazyVGrid に表示されます。このシートには、ボタンを介してそのエクササイズを追加するオプションがあります。
私が望んでいるのは、ボタンを押すと、グリッド項目が LazyVGrid から消え、カスタム タイプの ExerciseModel であるエクササイズが、選択したエクササイズの配列に追加されることです。
タイプ ExerciseModel は次のモデルに従います。
import Foundation
import SwiftUI
struct ExerciseModel: Identifiable, Hashable {
var id = UUID()
var exerciseID: String // ID for the exercise in DB
var userID: String // ID for the user in DB
var username: String // username of user in DB
var exerciseTitle: String
var dateCreate: Date
var exerciseImage: String // where is the image located
var repsInfo: String // How many repetitions for the exercise
var setsInfo: String // How many sets for the exercise
var sharedUserID: String? // ID for the shared user in DB
var sharedUserUsername: String? // Username for the shared user in DB
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
これまでのところ、ユーザーがルーチンに含めたいエクササイズを選択するメニューから始めて、これを行いました (ExerciseView は、エクササイズに関する情報を含む単純な ZStack です)。
import SwiftUI
struct ExerciseSelectView: View {
@ObservedObject var exercises: ExerciseArrayObject
@State var selectedExercise: ExerciseModel?
@State var selectionArray: [ExerciseModel] = [
]
@State var showSheet: Bool = false
@State var searchText = ""
@Environment(\.presentationMode) var presentationMode
var columns = Array(repeating: GridItem(.flexible()), count: 2)
var body: some View {
NavigationView {
VStack {
SearchBar(text: $searchText)
.padding(.all)
Divider()
ScrollView(.vertical, showsIndicators: false){
LazyVGrid(columns: columns, spacing: 10){
ForEach(exercises.dataArray.filter({"\($0)".contains(searchText) || searchText.isEmpty}), id: \.self) { i in
Button {
selectedExercise = i
showSheet.toggle()
} label: {
ExerciseView(exercise: i)
}
.sheet(item: $selectedExercise) { exercise in
ExerciseDetailAddView(exercise: exercise)
}
}
.listStyle(SidebarListStyle())
.navigationTitle("")
.navigationBarHidden(true)
}
}.padding()
}
}
}
}
参考までに、これはグリッド項目が押されたときに表示されるシート ビューです。
import SwiftUI
struct ExerciseDetailAddView: View {
@State var exercise: ExerciseModel
@State var selection: ExerciseModel?
@State var addToggle: Bool = false
var body: some View {
VStack {
ExerciseDetailView(exercise: exercise)
Button(action: {
if addToggle {
} else {
selection = exercise
addToggle.toggle()
print("--> selection: \(selection!)")
}
}, label: {
if addToggle {
Text("Exercise Added".uppercased())
.font(.headline)
.fontWeight(.bold)
.foregroundColor(.white)
.transition(.opacity)
} else {
Text("Add to Routine".uppercased())
.font(.headline)
.fontWeight(.bold)
.foregroundColor(.white)
}
})
.padding()
.frame(width: 300)
.background(addToggle ? Color.green : Color.blue)
.cornerRadius(25)
}
}
}