0

ユーザーがルーチンに含めたいリストからエクササイズを選択するメニューがあります。これらの演習は、対話に関するシートがポップアップ表示される LazyVGrid に表示されます。このシートには、ボタンを介してそのエクササイズを追加するオプションがあります。

私が望んでいるのは、ボタンを押すと、グリッド項目が L​​azyVGrid から消え、カスタム タイプの 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)
        }
    }    
}
4

0 に答える 0