【问题标题】:loop on toggle on swiftUI在 swiftUI 上循环切换
【发布时间】:2021-05-08 19:27:05
【问题描述】:

我是 swiftUI 的初学者,我想从结构数组中生成切换。

我的结构:

struct Provider : Identifiable  {
    var id:Int
    var name:String
    var isOn:Bool 
}

我的看法

import SwiftUI

struct ContentView: View {
    @State private var providers:[Provider] = [Provider(id: 8, name: "Netflix", isOn: true), Provider(id: 564,name:"SALTO",isOn: false), Provider(id: 350, name: "Apple Tv Plus", isOn: false)]
   
    var body: some View {
        VStack{
            ForEach (providers) {provider  in
                Toggle(isOn: .constant($provider.isOn), label: {
                Text("\(provider.name.capitalized)")
                })
           }
        }
    }   
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我不知道去哪里放绑定符号。

  • 如果我这样写会报错:“在范围内找不到$provider
  • 如果我放在 isOn 之前:“Provider 类型的值没有成员 $isOn
  • 如果我在 ForEach 中的提供者之前放置:“无法将 Binding<[Provider]> 类型的值转换为预期的参数类型 Range<Int>

但如果这样做:

VStack{
    Toggle(isOn: $providers[0].isOn, label: {
        Text("\(providers[0].name.capitalized)")
    })             
}

它的工作以及! 感谢您的帮助。

【问题讨论】:

    标签: swift for-loop struct syntax swiftui


    【解决方案1】:

    在您的上一个示例中,您了解了它的基础知识——能够修改 providers 数组的最简单方法是为其建立索引。这里有两种方法可以实现:

    struct ContentView: View {
        @State private var providers:[Provider] = [Provider(id: 8, name: "Netflix", isOn: true), Provider(id: 564,name:"SALTO",isOn: false), Provider(id: 350, name: "Apple Tv Plus", isOn: false)]
        
        var body: some View {
            VStack {
                ForEach(providers.indices) { providerIndex  in
                    Toggle(isOn: $providers[providerIndex].isOn) {
                        Text("\(providers[providerIndex].name.capitalized)")
                    }
                }
            }
        }
    }
    
    struct ContentView: View {
        @State private var providers:[Provider] = [Provider(id: 8, name: "Netflix", isOn: true), Provider(id: 564,name:"SALTO",isOn: false), Provider(id: 350, name: "Apple Tv Plus", isOn: false)]
        
        var body: some View {
            VStack {
                ForEach(Array(providers.enumerated()), id: \.1.id) { (index,provider)  in
                    Toggle(isOn: $providers[index].isOn) {
                        Text("\(provider.name.capitalized)")
                    }
                }
            }
        }
    }
    

    第二种是我的首选方式,因为您将provider 作为参数之一。大型集合存在轻微的性能问题,此时您可能需要从Swift Algorithms 探索indexed

    【讨论】:

    • 太好了——您可以通过单击绿色复选标记将答案标记为正确/接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多