多选导航视图列表

问题描述 投票:0回答:1

如果你看我之前的帖子,你可能会明白上下文。在此 Swift 文件中,有一个视图,其中向用户呈现来自 SQLite 数据库的多个练习。这些练习呈现在导航视图中。用户应该能够使用选择器选择一周中的某一天,然后选择他们想要在当天计划的多个练习。在他们完成所需的天数后,他们单击“保存”按钮,这将保存他们选择的练习以及各自的天数。然后,这些将显示在另一个视图中,这就是我在上一篇文章中提到的视图。这是代码:

import SwiftUI
import SQLite3

struct NewRoutine: View 
{
    @Binding var days: [String]
    @State var routineDay = "" // Initialize inside body
    @ObservedObject var exercisesdatabase: ExercisesDatabase
    @ObservedObject var routinedatabase: RoutineDatabase
    @State private var multiSelection = Set<UUID>() // Define multiSelection
    @Binding var slctInfo : Int

    var body: some View 
    {
        ZStack 
        {
            Rectangle()
                .foregroundColor(Color(.clear))
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .edgesIgnoringSafeArea(.all)
            Rectangle()
                .frame(width: 380, height: 550, alignment: .center)
                .foregroundColor(Color("Orange"))
                .cornerRadius(15)
                .shadow(radius: 15)

            VStack 
            {
                HStack 
                {
                    Button(action: {
                        slctInfo = 0
                    }) 
                    {
                        Image(systemName: "arrowshape.backward.fill")
                            .resizable().frame(width: 15, height: 17, alignment: .center)
                            .foregroundColor(Color.white)
                    }
                    .offset(x: -50, y: 5)

                    Text("Exercises")
                        .foregroundColor(.white)
                        .font(.title)
                        .fontWeight(.bold)
                        .padding(.bottom, 10)
                        .offset(y: 10)
                }

            NavigationView
                {
                    List 
                    {
                        ForEach(exercisesdatabase.exerciseList) { exercise in
                            ExerciseRow(exercise: exercise, isSelected: multiSelection.contains(exercise.id)) // Use custom row view with isSelected
                        }
                    }
                    .listStyle(.multipleSelection) // Enable multi-selection here
                }

            Picker(selection: $routineDay, label: Text("Day of the Week"))
                {
                    ForEach(days, id: \.self) 
                    {
                        i in Text(i)
                    }
                }
                .pickerStyle(.menu)

            Button(action: {
                for exercise in exercisesdatabase.exerciseList where multiSelection.contains(exercise.id) {
                    routinedatabase.routineList.append(Routines(routineID: routinedatabase.routineIDMax + 1, Exercise: exercise.Name, Day: routineDay))

            // Database interaction
                    var stmt: OpaquePointer?
                    let insertRoutine = "INSERT INTO Routines (RoutineID, Exercise, Day) VALUES (?, ?, ?)"

                    if sqlite3_prepare_v2(db, insertRoutine, -1, &stmt, nil) == SQLITE_OK 
                    {
                        let id = Int32(routinedatabase.routineIDMax + 1)
                        let exercise_db = exercise.Name
                        let day_db = routineDay

                        sqlite3_bind_int(stmt, 1, id)
                        sqlite3_bind_text(stmt, 2, (exercise_db as NSString).utf8String, -1, nil)
                        sqlite3_bind_text(stmt, 3, (day_db as NSString).utf8String, -1, nil)

                        if sqlite3_step(stmt) == SQLITE_DONE 
                        {
                            print("Routine saved successfully!")
                        } 
                        else
                        {
                            print("Error saving routine: \(String(cString: sqlite3_errmsg(db)))")
                        }
                    } 
                    else
                    {
                        print("Error preparing insert statement: \(String(cString: sqlite3_errmsg(db)))")
                    }

                    sqlite3_finalize(stmt)
                }
            }) 
                {
                ZStack
                {
                    Rectangle()
                        .frame(width: 100, height:50)
                        .foregroundColor(Color("Red"))
                        .cornerRadius(15)
                        .shadow(radius: 15)
                    Text("Save")
                        .foregroundColor(.white)
                        .bold()
                }
                }
                .offset(y: -10)
            }
        }
    }
}

struct ExerciseRow: View 
{
    let exercise: Exercises
    let isSelected: Bool

    var body: some View 
    {m
        HStack 
        {
            Text(exercise.Name)
            Spacer()
            
            if isSelected 
            {
                Image(systemName: "checkmark")
            }
        }
    }
}

问题是我在

.listStyle(.multipleSelection)
行收到错误“Type 'ListStyle' has no member 'multipleSelection'”。

swift list swiftui menu multipleselection
1个回答
0
投票

使用

List
selection
(而不是 ForEach)尝试此方法,例如 在此示例代码中:

struct Exercise: Identifiable {
    let id = UUID()  // <--- here
    let name: String
}

struct ContentView: View {
    let exercises = [Exercise(name: "Aerobics"),Exercise(name: "Jogging"),Exercise(name: "Swimming")]
    
    @State private var multiSelection = Set<UUID>()  // <--- here
    
    var body: some View {
        VStack {
            Text("\(multiSelection.count) selections")
            Spacer()
            List(exercises, selection: $multiSelection) { exercise in  // <--- here
                Text(exercise.name)
            }
        }
    }
}

注意,您的评论

.listStyle(.multipleSelection) // Enable multi-selection here
不正确。
.listStyle

中无法启用多项选择
© www.soinside.com 2019 - 2024. All rights reserved.