首页 > 解决方案 > SwiftUI 中用于 ForEach 的自定义视图数组

问题描述

我有 4 个类似的视图,就像SettingsPointOneView()图中的每个点一样。他们存储 2 个视图SliderFirstPointX()SliderFirstPointY()在这种情况下。它们(SliderFirstPointX 等...)使用滑块控制和更改自定义图形特定点的轴(x,y)值。

外观:</p>

在此处输入图像描述

SliderFirstPointX() 和 SliderFirstPointY()

struct SliderFirstPointX: View{
@EnvironmentObject var geometryBuilder : GeometryBuilderViewModel
var body: some View{
    VStack{
        Text("Point one: X")
        Text("\(Int(geometryBuilder[0].x))")
            .foregroundColor(.gray)
            .opacity(0.5)
        Slider(value: $geometryBuilder[0].x, in: 10...380)
            .accentColor(.orange)
            .padding(3)
    }
}
}


struct SliderFirstPointY: View{
@EnvironmentObject var geometryBuilder: GeometryBuilderViewModel
var body: some View{
    VStack{
        Text("Point one: Y")
        Text("\(Int(geometryBuilder[0].y))")
            .foregroundColor(.gray)
            .opacity(0.5)
        Slider(value: $geometryBuilder[0].y, in: 0...380)
            .accentColor(.orange)
            .padding(3)
    }
}
}

设置PointOneView()

struct SettingsPointOneView: View{
var body: some View{
    ZStack{
        RoundedRectangle(cornerRadius: 10)
            .stroke()
            .frame(width: 360, height: 150, alignment: .leading)

        HStack{
            SliderFirstPointX()
            SliderFirstPointY()
        }.padding([.leading, .trailing], 50)
    }
}
}

我想将它们定位到 LazyVGrid 中,类似于屏幕截图上的样子。所以我创建了常量 var 并尝试像这样初始化它:

let arrayOfViews: [Any] = [SettingsPointOneView(), SettingsPointTwoView(), SettingsPointThreeView(), SettingsPointFoutView()]

之后,出现了几条错误消息,我不知道如何处理:

在 ForEach 前面: • 作为类型的协议 'Any' 不能符合 'AccessibilityRotorContent

在 LazyVGrid 前面:

• 通用结构'LazyVGrid' 要求'some AccessibilityRotorContent' 符合'View';

• Initializer 'init(columns:alignment:spacing:pinnedViews:content:)' 要求'some AccessibilityRotorContent' 符合'View';

• 结构“ViewBuilder”要求“某些 AccessibilityRotorContent”符合“View”

因为我没有找到补救措施,我不得不使用这个实现,但这并不让我满意:

struct ContentView: View {

...some code...

let first = [SettingsPointOneView()]
let second = [SettingsPointTwoView()]
let third = [SettingsPointThreeView()]
let fourth = [SettingsPointFourView()]
     var body: some View {

      ..some code...

       ScrollView{
            LazyVGrid(columns: [GridItem(.flexible(minimum: 100, maximum: 200))]){
                ForEach(0...0, id: \.self){
                    first[$0].padding(.top)
                    second[$0]
                    third[$0]
                    fourth[$0]
                }
        }

..some code...

       }

这个解决方案效果很好,虽然我猜这是实现这个功能的错误方法。

有没有办法在 ForEach 中使用视图数组的方法?

说实话,我已经编程了 3 个月,所以我会很感激任何关于我作为 Swift 开发人员应该学习什么的建议。

标签: arraysswiftswiftuiswiftui-foreachlazyvgrid

解决方案


推荐阅读