首页 > 解决方案 > SwiftUI:当我切换 Bool showAnswer 时,会显示所有问题的所有答案。我需要分别切换每个答案

问题描述

我无法独立切换每个问题的答案。我尝试将 Bool 添加到包含问题和答案的结构中,但错误表明 Bool 是不可变的。

https://github.com/williamallenmd/FlashCardTests

import SwiftUI

struct ItemsView: View {
  @StateObject var vm = ItemViewModel()
  @State private var showAnswer: Bool = false
  
    var body: some View {
      List(vm.items) { item in
        VStack(alignment: .leading, spacing: 10) {
          
          Button(item.question) {showAnswer.toggle()}
          showAnswer ? Text(item.answer) : Text(" ")
          
        }
      }
      .onAppear { vm.fetch()}
    }
}

标签: mvvmswiftui

解决方案


你可以试试这个简单的方法,对我很有效:

使用这种方法,不需要每个项目都有自己的状态,也不需要带有键的变量数组,也不需要更改模型。

struct ItemsView: View {
    @StateObject var vm = ItemViewModel()
    @State private var showAnswer: Bool = false
    @State private var selectedItem: ItemModel = ItemModel() // <--- here
    
    var body: some View {
        List(vm.items) { item in
            VStack(alignment: .leading, spacing: 10) {
                Button(item.question) {
                    selectedItem = item  // <--- here
                    showAnswer = true
                }
                // --- here ---
                if showAnswer && selectedItem.id == item.id {
                    Text(selectedItem.answer)
                } else {
                    Text(" ")
                }
            }
        }
        .onAppear {
            vm.fetch()
        }
    }
}

推荐阅读