如果你看我之前的帖子,你可能会明白上下文。在此 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'”。
使用
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
中无法启用多项选择