无法在 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)
}
}
}
}
我无法访问使用开关。我想如果开关打开,它应该出现一个文本字段,如果它关闭,变量的值应该为零。谁能帮我这个。我尝试使用两种不同的方法。一种使用 .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)
}
}
}
}