切换状态更改时执行一些操作

时间:2019-12-18 15:42:15

标签: ios swift xcode swiftui

我正在使用SwiftUI,并且想要在切换状态更改时做一些事情,但是我找不到解决方案。

当切换状态更改时,如何调用函数或做什么?

@State var condition = false

Toggle(isOn: $condition) {
    Text("Toggle text here")
}

5 个答案:

答案 0 :(得分:1)

您可以像下面的第一个示例一样使用 .onChange 修饰符。

但是,请记住,在大多数情况下我们不需要它。

  • 如果是视图设置,则绑定到 @State bool 值,然后使用此 bool 修改视图层次结构,如第一个示例所示。

  • 如果您的模型发生变化,您可以将开关绑定到模型或模型控制器中的 @Published 值。在这种情况下,模型或模型控制器从开关接收更改,执行任何请求,然后重新渲染视图。它必须具有对您的模型的 @ObservedObject 引用。

我在第一个示例中展示了如何使用 .onChange 修饰符。它只是记录状态。

请记住,SwiftUI 视图中的逻辑应尽可能少。 顺便说一句,在 SwiftUI 发明之前,这已经是真的了 ;)

示例 1 - @State 值。 (本地界面设置)

import SwiftUI

struct ToggleDetailView: View {
    @State var isDetailVisible: Bool = true

    var body: some View {
        VStack {
            Toggle("Display Detail", isOn: $isDetailVisible)
                .onChange(of: self.isDetailVisible, perform: { value in
                    print("Value has changed : \(value)")
                })
            if isDetailVisible {
                Text("Detail is visible!")
            }
        }
        .padding(10)
        .frame(width: 300, height: 150, alignment: .top)
    }
}

struct ToggleDetailView_Previews: PreviewProvider {
    static var previews: some View {
        ToggleDetailView()
    }
}

示例 2 - @ObservedObject 值。 (对模型的操作)

import SwiftUI

class MyModel: ObservableObject {
    @Published var isSolid: Bool = false
    
    var string: String {
        isSolid ? "This is solid" : "This is fragile"
    }
}

struct ToggleModelView: View {
    @ObservedObject var model: MyModel
    
    var body: some View {
        VStack {
            Toggle("Solid Model", isOn: $model.isSolid)
            Text(model.string)
        }
        .padding(10)
        .frame(width: 300, height: 150, alignment: .top)
    }
}

struct ToggleModelView_Previews: PreviewProvider {
    static var previews: some View {
        ToggleModelView(model: MyModel())
    }
}

答案 1 :(得分:0)

尝试

struct ContentView: View {

    @State var condition = false


    var body: some View {

        if condition {

           callMe()
        }
        else {

            print("off")
        }
          return Toggle(isOn: $condition) {
              Text("Toggle text here")
          }

    }

    func callMe() {


    }
}

答案 2 :(得分:0)

凯伦,请检查

0.0011711121

添加这样的功能

@State var isChecked: Bool = true
@State var index: Int = 0
Toggle(isOn: self.$isChecked) {
    Text("This is a Switch")
    if (self.isChecked) {
        Text("\(self.toggleAction(state: "Checked", index: index))")
    } else {
        CustomAlertView()
        Text("\(self.toggleAction(state: "Unchecked", index: index))")
    }
}

答案 3 :(得分:0)

如果要在切换状态更改时执行某些操作,则可以使用didSet。

struct ContentView: View {

    @State var condition = false{
        didSet{
            print("condition changed to \(condition)")
        }
    }

    var body: some View {

       let bind = Binding<Bool>(
          get:{self.condition},
          set:{self.condition = $0}
        )

        return Toggle(isOn: bind){
            Text("Toggle text here")
        }
    }
}

当我们说@State var condition = true时,它的类型是State<Bool>而不是Bool。          当我们在切换中使用绑定(在这种情况下为$condition时),切换直接更改了存储的值。这意味着它永远不会更改@State,所以didSet将永远不会被触发。

因此,在这里,我们创建let bind结构的实例并将其分配给Binding<Value>,并在切换中直接使用该Binding结构。比当我们设置self.condition = $0时,它将触发didSet。

答案 4 :(得分:0)

我倾向于使用:

Toggle(isOn: $condition, label: {
                Text("Power: \(condition ? "On" : "Off")")
            })
    .padding(.horizontal, 10.0)
    .frame(width: 225, height: 50, alignment: .center)