使用SwiftUI按钮动作切换Binding <Bool>

时间:2020-03-04 15:45:24

标签: swift swiftui

我正在尝试在SwiftUI中创建一个简单的带标签的复选框,当按下按钮时可以切换isChecked。这与Apple Binding文档中的示例非常相似:

import SwiftUI

struct LabeledCheckbox: View {
    var labelText: String
    @Binding var isChecked: Bool

    var checkBox: Image {
        Image(systemName: isChecked ? "checkmark.circle" : "circle")
    }

    var body: some View {
        Button(action: {
            self.isChecked.toggle()
        }) {
            HStack {
                checkBox
                Text(labelText)
            }
        }
    }
}

struct LabeledCheckbox_Previews: PreviewProvider {
    static var previews: some View {
        LabeledCheckbox(labelText: "Checkbox", isChecked: .constant(false))
    }
}

不幸的是,当我在“实时预览”模式下与此按钮交互时,该按钮动作似乎并没有实际切换isChecked。您可以查看该here。我在print(isChecked ? "checked" : "unchecked")闭包中放入了action调试语句,并在控制台输出中观察到isChecked从未切换。

我还试图通过在LabeledCheckbox中传递状态变量来使LabeledCheckbox_Previews可以被切换。该按钮仍然不可切换。

struct LabeledCheckbox_Previews: PreviewProvider {
    @State private static var isChecked = false

    static var previews: some View {
        LabeledCheckbox(labelText: "Checkbox", isChecked: $isChecked)
    }
}

我在做什么错?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您需要提供可变状态,而不是恒定值。例如这样的

import SwiftUI

struct LabeledCheckbox: View {
  var labelText: String
  @Binding var isChecked: Bool

  var checkBox: Image {
    Image(systemName: isChecked ? "checkmark.circle" : "circle")
  }

  var body: some View {
    Button(action: {
      self.isChecked.toggle()
    }) {
      HStack {
        checkBox
        Text(labelText)
      }
    }
  }
}

struct ContentView: View {
  @State private var isChecked = false

  var body: some View {
    LabeledCheckbox(labelText: "Checkbox", isChecked: $isChecked)
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
}