无法在 swift ui 的 if else 条件下使用切换开关

Not able to use the Toggle Switch with if else conditions in swift ui

我无法访问使用开关。我想如果开关打开,它应该出现一个文本字段,如果它关闭,变量的值应该为零。谁能帮我这个。我尝试使用两种不同的方法。一种使用 .Onchange,另一种不使用 .Onchange。当我使用 .Onchange 时,它​​会提示未使用文本字段的结果。当我不使用 .onAppear 时,它不接受 (userSettings.load = 0) 但文本字段工作正常。我不明白我做错了什么 here.The 变量定义为:

struct TwoView: View {
    @EnvironmentObject var userSettings: UserSettings
    @State var load: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                Form {
                    Toggle("Casual loading", isOn: $load)
                        .onChange(of: load) { value in
                            if load == false
                            {
                                userSettings.loadrate = 0
                            }
                            else
                            {
                                TextField("Casual Loading", value: $userSettings.loadrate, format: .number)
                            }
                        }
                }
            }
        }
    }
}
class UserSettings: ObservableObject
{
    @Published var loadrate = Float()
}

现在,您正在视图层次结构之外使用 TextField,就在 onChange 内部。事实上,正如您所提到的,Xcode 正在警告您它未被使用的事实。

要解决这个问题,您可以在层次结构本身内部使用 if 子句:

struct ContentView : View {
    var body: some View {
        TwoView().environmentObject(UserSettings())
    }
}

struct TwoView: View {
    @EnvironmentObject var userSettings: UserSettings
    @State var load: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                Form {
                    Toggle("Casual loading", isOn: $load)
                        .onChange(of: load) { value in
                            //only imperative, non-View hierarchy code should go in this block
                            if load == false
                            {
                                userSettings.loadrate = 0
                            }
                        }
                    if load { //<-- Here
                        TextField("Casual Loading", value: $userSettings.loadrate, format: .number)
                    }
                }
            }
        }
    }
}

class UserSettings: ObservableObject
{
    @Published var loadrate = Float()
}

TextField 是一个视图元素,不应位于闭包内。它应该是一个 child 的视图。 同样,赋值不是视图元素,所以不接受在视图中。

所以,你要做的就是把userSettings.loadrate = 0放到.onChange里面,把TextField放到.onChange外面。

我不确定你的预期结果到底是什么,但这里有一个例子。

NavigationView {
    VStack {
        Form {
            Toggle("Casual loading", isOn: $load)
                .onChange(of: load) { value in
                    // Assignment should be inside a closure
                    if load == false {
                        userSettings.loadrate = 0
                    }
                }
            if load == true {
                // View element should be a child of a view.
                TextField("Casual Loading", value: $userSettings.loadrate, format: .number)
            }
        }
    }
}