SwiftUI:NavigationLinks 依赖于 Toggle 状态
SwiftUI: NavigationLinks dependent on Toggle states
我正在尝试创建一个 NavigationLink
目标,如果多个切换开关中的任何一个设置为 TRUE,该目标就会发生变化。我已经为使用标签和状态变量的链接制定了 if/then 逻辑。也就是说,如果我手动设置 toggleCount =
链接会正常工作。
然而,我想做的是设置 toggleCount =
真实开关的数量。您可以看到我尝试循环遍历数组并递增 toggleCount
的失败尝试。它失败了,因为它不符合视图。
关于干净的实现方法有什么建议吗?我不一定需要计算 true 开关的数量,我只需要知道其中是否有任何一个被设置为 true。
import SwiftUI
struct ToggleStruct : Identifiable {
var id : Int
var name : String
var position : Bool
}
struct ContentView: View {
@State var toggleArray = [ToggleStruct(id: 1, name: "Toggle 1", position: false),
ToggleStruct(id: 2, name: "Toggle 2", position: false),
ToggleStruct(id: 3, name: "Toggle 3", position: false)
]
@State private var selection: Int? = nil
var toggleCount = 0
var body: some View {
NavigationView {
VStack {
Text("Toggle Count: \(toggleCount)")
ForEach(0..<toggleArray.count) { i in
Toggle(isOn: $toggleArray[i].position, label: {
Text(toggleArray[i].name)
})
}
NavigationLink(
destination: Text("Destination A"),
tag: 1,
selection: $selection,
label: {EmptyView()})
NavigationLink(
destination: Text("Destination B"),
tag: 2,
selection: $selection,
label: {EmptyView()})
Button(action: {
// ForEach(0..<toggleArray.count) { x in
// if toggleArray[x].position {
// toggleCount += 1
// }
// }
if toggleCount > 0 {
selection = 1
} else {
selection = 2
}
}, label: {
Text("Continue")
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这样的事情对你有用吗?您可以根据需要更改 destinationView
中的逻辑。
import SwiftUI
struct ContentView: View {
@State var toggleOneIsOn = false
@State var toggleTwoIsOn = false
@State var toggleThreeIsOn = false
var body: some View {
NavigationView {
Form {
Toggle("Toggle One", isOn: $toggleOneIsOn)
Toggle("Toggle Two", isOn: $toggleTwoIsOn)
Toggle("Toggle Three", isOn: $toggleThreeIsOn)
NavigationLink("Foo", destination: destinationView)
}
}
}
var destinationView: some View {
switch (toggleOneIsOn, toggleTwoIsOn, toggleThreeIsOn) {
case _ where toggleOneIsOn || toggleTwoIsOn || toggleThreeIsOn:
return Text("At least one toggle is on")
default:
return Text("All toggles are off")
}
}
}
我正在尝试创建一个 NavigationLink
目标,如果多个切换开关中的任何一个设置为 TRUE,该目标就会发生变化。我已经为使用标签和状态变量的链接制定了 if/then 逻辑。也就是说,如果我手动设置 toggleCount =
链接会正常工作。
然而,我想做的是设置 toggleCount =
真实开关的数量。您可以看到我尝试循环遍历数组并递增 toggleCount
的失败尝试。它失败了,因为它不符合视图。
关于干净的实现方法有什么建议吗?我不一定需要计算 true 开关的数量,我只需要知道其中是否有任何一个被设置为 true。
import SwiftUI
struct ToggleStruct : Identifiable {
var id : Int
var name : String
var position : Bool
}
struct ContentView: View {
@State var toggleArray = [ToggleStruct(id: 1, name: "Toggle 1", position: false),
ToggleStruct(id: 2, name: "Toggle 2", position: false),
ToggleStruct(id: 3, name: "Toggle 3", position: false)
]
@State private var selection: Int? = nil
var toggleCount = 0
var body: some View {
NavigationView {
VStack {
Text("Toggle Count: \(toggleCount)")
ForEach(0..<toggleArray.count) { i in
Toggle(isOn: $toggleArray[i].position, label: {
Text(toggleArray[i].name)
})
}
NavigationLink(
destination: Text("Destination A"),
tag: 1,
selection: $selection,
label: {EmptyView()})
NavigationLink(
destination: Text("Destination B"),
tag: 2,
selection: $selection,
label: {EmptyView()})
Button(action: {
// ForEach(0..<toggleArray.count) { x in
// if toggleArray[x].position {
// toggleCount += 1
// }
// }
if toggleCount > 0 {
selection = 1
} else {
selection = 2
}
}, label: {
Text("Continue")
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这样的事情对你有用吗?您可以根据需要更改 destinationView
中的逻辑。
import SwiftUI
struct ContentView: View {
@State var toggleOneIsOn = false
@State var toggleTwoIsOn = false
@State var toggleThreeIsOn = false
var body: some View {
NavigationView {
Form {
Toggle("Toggle One", isOn: $toggleOneIsOn)
Toggle("Toggle Two", isOn: $toggleTwoIsOn)
Toggle("Toggle Three", isOn: $toggleThreeIsOn)
NavigationLink("Foo", destination: destinationView)
}
}
}
var destinationView: some View {
switch (toggleOneIsOn, toggleTwoIsOn, toggleThreeIsOn) {
case _ where toggleOneIsOn || toggleTwoIsOn || toggleThreeIsOn:
return Text("At least one toggle is on")
default:
return Text("All toggles are off")
}
}
}