【问题标题】:SwiftUI: NavigationLinks dependent on Toggle statesSwiftUI:NavigationLinks 依赖于切换状态
【发布时间】:2021-04-21 19:14:11
【问题描述】:

我正在尝试创建一个NavigationLink 目标,如果多个切换开关中的任何一个设置为 TRUE,该目标就会发生变化。我已经使用标签和状态变量为链接制定了 if/then 逻辑。也就是说,如果我手动设置 toggleCount = 链接可以正常工作。

然而,我想做的是设置toggleCount = 真正开关的数量。您可以看到我尝试循环遍历数组并递增toggleCount 失败。失败是因为不符合 View。

关于实现这一点的干净方法有什么建议吗?我不一定需要计算真正的开关的数量,我只需要知道其中是否有任何一个设置为 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()
    }
}

【问题讨论】:

  • 如果尚未测试其余代码以查看其是否有效,但马上,我可以说ForEach 用于在您已经发现的View 中使用.你可能想要toggleArray.forEach { toggle in ... }

标签: swiftui toggle swiftui-navigationlink


【解决方案1】:

这样的东西对你有用吗?您可以将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")
        }
    }
}

【讨论】:

  • 是的...带外壳的开关在这里很好用,谢谢!
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 2013-07-06
  • 1970-01-01
相关资源
最近更新 更多