Проблема с изменением логического значения пользовательского класса с помощью переключателя SwiftUI

#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. Это все исправило. Спасибо, ахезе!