ios - SwiftUI 是否可以在 ForEach 中传递绑定范围?
问题描述
我想在 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()
}
}
周围的工作
我发现是传递所有列表并执行 subView 内的范围。但我不想这样做,因为数组非常大:
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 的新实现
struct SubView: View {
var model: TheModel
var range: Range<Int>
var body: some View {
HStack {
ForEach (model.list[range].indices, id:\.self) { idx in
HStack {
Button(action: {
model.list[idx] += 1
print(model.list)
}, label: {
Text("num: \(model.list[idx])")
})
}
}
}
}
}
请注意,我添加indices
到ForEach
标题中以确保我们使用索引而不是数组中的值访问数组。
调用视图看起来像
var body: some View {
VStack {
SubView(model: model, range: (0..<5))
Text("\(model.list.map(String.init).joined(separator: "-"))")
}
额外Text
的只是为了测试目的
推荐阅读
- angular - 调用许多 Observable if 运算符
- php - Laravel 数据库关系不会加载关联数据(编辑)
- c# - C# 在 datetimepicker 中获取 datagridview 日期
- javascript - 树莓串口在一段时间后自动停止
- angular - Ionic 3 搜索栏组件
- spring - hibernate.connection.handling_mode 和 REQUIRES_NEW 事务(Hibernate 5.2+Spring 4.3)
- python - Django .latest() 值
- makefile - 如何用make编译avr c和c++源代码
- python-3.x - 网页抓取评论 -Flipkart
- android - SQLite / FTS3 / FTS4 / Android中撇号的自定义令牌字符?