У меня есть приложение для тренировок, использующее SwiftData, где пользователь может начать новую тренировку. При нажатии кнопки «Пуск» пользователь перенаправляется в новое представление (CurrentWorkoutView), в котором создается экземпляр объекта тренировки. Затем пользователь мог сохранить или отменить тренировку.
Я столкнулся с 2 проблемами:
Это упрощенная версия кода:
// HomeView.swift
...
NavigationLink("Start Workout") {
CurrentWorkoutView()
}
...
// CurrentWorkoutView.swift
@Environment(\.dismiss) var dismiss
@Environment(\.modelContext) var context
@Bindable var workout: Workout = Workout()
var body: some View {
...
.toolbar {
ToolbarItem(placement: .confirmationAction) {
Button("Save") {
workout.end = Date.now
context.insert(workout)
dismiss()
}
}
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") {
context.delete(workout)
try! context.save()
dismiss()
}
}
}
}
Я пытался установить тренировку как обнуляемую, но, поскольку ее можно привязать, я не могу. Он должен быть привязываемым, чтобы можно было редактировать заголовок, описание и т. д.
Не следует использовать @Bindable, если объект владеет представлением, вместо этого используйте здесь State. А с помощью @State мы также можем сделать это свойство необязательным.
@State private var workout: Workout?
Создайте его в onAppear
.onAppear {
workout = Workout()
}
А поскольку объект не был вставлен в ModelContext, удалять его тоже не нужно, просто установите для него значение nil в действии кнопки «Отмена».
Пришлось использовать обходной путь, чтобы привязки текстового поля могли работать с необязательным полем, но это решило мою проблему. Спасибо!!