#swiftui #binding #toggle
Вопрос:
У меня есть пользовательский класс «Домашнее задание», который имеет логическое значение «IsComplete». Он отображается в пользовательском представлении, называемом HomeworkView.
В HomeworkView есть подвид под названием ToggleView, который содержит метку и переключатель, чтобы показать, как вы уже догадались, завершена ли домашняя работа или нет. Я не уверен, как настроить это так, чтобы переключатель в ToggleView изменял значение экземпляра «домашнее задание». Любая помощь для этого нуба будет признательна.
Мой класс:-
class Homework {
var title: String
var details: String
var isComplete: Bool
init(title: String, details: String, isComplete: Bool) {
self.title = title
self.details = details
self.isComplete = isComplete
}
}
ToggleView и домашний просмотр:-
struct ToggleView: View {
@State var isComplete: Bool
var body: some View {
HStack {
Text("Is it complete?")
.labelsHidden()
VStack(alignment: .center) {
Text(isComplete ? "YES" : "NO")
.foregroundColor(isComplete ? .green : .orange)
Toggle("", isOn: $isComplete)
}
.padding(.horizontal)
.frame(width: 80)
}
.padding()
}
}
struct HomeworkView: View {
@State var homework: Homework
var body: some View {
VStack {
Text(homework.isComplete ? "COMPLETED" : "PENDING")
.font(.largeTitle)
ToggleView(isComplete: homework.isComplete)
.onTapGesture {
print("(homework.isComplete.hashValue)")
}
}
}
}
Ответ №1:
@State
работает только на struct
s, поэтому сначала измените Homework
на a struct
.
struct Homework {
var title: String
var details: String
var isComplete: Bool
/// no need for `init`, because structs get it for free!
}
Затем, внутри HomeworkView
, вам нужно будет создать экземпляр homework
( @State
vars обычно нужно создавать в начале).
@State var homework = Homework(title: "", details: "", isComplete: false)
Наконец, измените ToggleView
» s isComplete
@Binding
» на «а».
struct ToggleView: View {
@Binding var isComplete: Bool
...
}
@Binding
Bool
синхронизирует значение с @State
.
Комментарии:
1. Это все исправило. Спасибо, ахезе!