在 swiftUI 上循环切换
loop on toggle on swiftUI
我是 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)")
})
}
这也是工作!
感谢您的帮助。
在上一个示例中,您了解了它的基础知识——能够修改 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
我是 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)")
})
}
这也是工作! 感谢您的帮助。
在上一个示例中,您了解了它的基础知识——能够修改 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