当前位置: 首页 > 知识库问答 >
问题:

SwiftUI在foreach中是否可以传递绑定范围?

陈扬
2023-03-14

我想在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])")
                })
                
            }
            
        }
    }
}

共有1个答案

阚乐湛
2023-03-14

我会将模型传递给子视图,因为它是一个类,并且将通过引用传递,然后将范围作为单独的参数传递。

这是我对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])")
                    })
                }
            }
        }
    }
}

注意,我向foreach头添加了indexs以确保使用索引而不是数组中的值访问数组。

调用视图将如下所示

var body: some View {
    VStack {
        SubView(model: model, range: (0..<5))
        Text("\(model.list.map(String.init).joined(separator: "-"))")
    }

额外的文本只是用于测试目的

 类似资料:
  • 问题内容: 我有一个可选参数,它本身支持参数列表。 我的意思是,它应该支持: -f 1 2 -f 1 2 3 但不是: -f 1 -f 1 2 3 4 有没有办法在argparse中强制执行此操作?现在,我使用nargs =“ *”,然后检查列表长度。 编辑: 根据要求,我需要的是能够定义一个可接受数量的参数范围。我的意思是说(在示例中)2或3个args是正确的,但不是1或4或不在2..3范围内的

  • 这是我的可选装订 所以现在当我尝试调用这个构造函数时: 我得到了这个错误: 绑定

  • 问题内容: 这是当前的工作方式,也是Maven Deploy插件的用法 pom.xml settings.xml 而我想要实现的目标是找到一种在命令行中键入用户名和密码的方式。达到 问题答案: 在被认为是个人的,所以对于这个原因,用户名+密码存储在(用户)。因此,一般而言,没有理由将它们作为参数传递。(顺便说一句,密码可以在此处以加密方式存储)无法通过命令行传递密码。但是,我见过类似的骇客: 现在

  • 问题内容: 我想做这样的事情: 但是我得到这个错误 对成员’init()’的不明确引用 我知道我可以写 但是我想知道是否还有另一种方式。 问题答案: 问题在于不存在 仅 具有参数的初始化程序。 __ 目前只存在: 尽管该参数具有默认值,但是编译器仅在初始化程序的调用位置为您“填充”该默认值。 获取对函数本身的引用时,不会部分应用默认参数值,编译器也不会为默认参数值的所有可能组合生成额外的重载。后者

  • 问题内容: 我想将所有内容都保留在virtualenv中。OpenCV有可能吗?我可以从头开始构建,我是否只需要先设置virtualenv,然后使用特殊的编译标志告诉它安装在哪里? 问题答案: 我发现解决方案是必须将cv2.so和cv.py复制到运行virtualenv的目录,然后pip install numpy。为此,我使用了Ubuntu12.04。

  • 我正在尝试构建一个自定义的< code>NavBar,带有一些可选的< code >视图,比如searchbar(但前提是视图需要显示它)。 基本上,我需要在视图中传递一些带有参数。 下面是一个示例: 我所说的属性是和。但是执行 或 会引发编译错误: 无法将类型“绑定?”的值分配给类型“绑定” 你知道我该如何解决这个问题吗? 还是有更好的方法来做我想做的事?