【发布时间】:2021-03-06 12:59:33
【问题描述】:
我想在 ForEach 内部的模型中传递一个数组范围。
我重新创建了一个示例:
import SwiftUI
class TheModel: ObservableObject {
@Published var list: [Int] = [1,2,3,4,5,6,7,8,9,10]
}
struct MainView: View {
@StateObject var model = TheModel()
var body: some View {
VStack {
ForEach (0...1, id:\.self) { item in
SubView(subList: $model.list[0..<5]) <-- error if I put a range
}
}
}
}
struct SubView: View {
@Binding var subList: [Int]
var body: some View {
HStack {
ForEach (subList, id:\.self) { item in
Text("\(item)")
}
}
}
}
struct MainView_Previews: PreviewProvider {
static var previews: some View {
MainView()
}
}
变通方法
我发现是传递所有列表并执行子视图内的范围。但我不想这样做,因为数组非常大:
struct MainView: View {
@StateObject var model = TheModel()
var body: some View {
VStack {
ForEach (0...1, id:\.self) { i in
SubView(subList: $model.list, number: i, dimension: 5)
}
}
}
}
struct SubView: View {
@Binding var subList: [Int]
var number: Int
var dimension: Int
var body: some View {
HStack {
ForEach (subList[number*dimension..<dimension*(number+1)].indices, id:\.self) { idx in
Button(action: {
subList[idx] += 1
print(subList)
}, label: {
Text("num: \(subList[idx])")
})
}
}
}
}
【问题讨论】:
-
为什么
SubView.subList是一个绑定?SubView可以以某种方式更改给它的数组,并且您希望更改反映在TheModel.list中吗? -
@Sweeper 是的,在解决方法中,我插入了一个按钮,例如更改项目的示例
-
哦,对了。我没有过多阅读您的解决方法代码,并认为它们是相同的,哈哈
-
请注意,您不能通过从
list[0..<5]获得的ArraySlice改变原始数组,即使没有这些 SwiftUI 的东西。所以我的想法是编写你自己的引用类型来包装一个数组,你可以将它传递给子视图,而这次不需要复制整个数组。 -
@Sweeper 你能用代码写出你的想法吗? :)