ScrollView表现异常(Xcode 11 GM种子-SwiftUI)

时间:2019-09-13 02:11:05

标签: swiftui ios13 xcode11 swiftui-list

我正在尝试制作自定义列表。如果我们在scrollView中添加Encapsulated VStack并尝试从该VStack添加新行,则其行为很奇怪。但是我们必须封装,因为在Xcode中会给出“复杂的视图编译器错误”。我正在提供完整的代码,以更好地理解。请尝试运行它。新元素未按预期添加,因此将所有内容向上推。

struct RowView: View {

var body: some View {
    VStack{
          HStack{
              Spacer()

              .foregroundColor(Color.black)
              Spacer()
          }

      }
      .background(Color.white)
      .cornerRadius(13)
      .padding()
}}

struct cView:View {
@State var array: [String] = []

@State var height: CGFloat = 60
var body: some View {
    VStack{
        Button(action: {
            self.array.append("Test")
        }, label: {
            Text("Add")
        })

        VStack{

            ForEach(array, id: \.self){_ in
                 RowView()
            }
        }
        .background(Color.red)
        .cornerRadius(13)
        .padding()

    }


}}

struct ContentView : View {


@State var array: [String] = []

var body: some View {

        ScrollView{

            VStack{


                Text("d")
                    .frame(height: 90)
                VStack{
                       cView()
                }



            }
        }
        .navigationBarTitle("Test", displayMode: .automatic)


}}

2 个答案:

答案 0 :(得分:1)

当我重新格式化并删除未使用的内容时,我得到了:

struct RowView: View {
    let text: String

    var body: some View {
        VStack{
            HStack{
                Spacer()
                Text(text).foregroundColor(Color.black)
                Spacer()
            }
        }
        .background(Color.white)
        .cornerRadius(13)
        .padding()
    }
}

struct cView:View {
    @State var array: [String] = []

    @State var height: CGFloat = 60
    var body: some View {
        VStack{
            Button(
                action: { self.array.append("Test") },
                label: { Text("Add") }
            )
            ForEach(array, id: \.self){text in
                RowView(text: text)
            }
            .background(Color.red)
            .cornerRadius(13)
            .padding()
        }
    }
}

struct ContentView : View {
    var body: some View {
        List {
            VStack{
                Text("d")
                cView()
            }
        }
    }
}

ScrollView是真正的PITA,它讨厌Text,这就是为什么我用List替换了它。 RowView缺少文本恕我直言,所以我放入其中。ContentView中的数组从未使用过,因此我将其删除了,同样,navigatinBarTitle需要一个NavigationView。

这并不是一个真正的答案,因为它使用List而不是ScrollView,但它确实指出了问题所在。这也很奇怪,因为所有内容都在一个“列表”行中,但是我尝试尽可能少地更改。

您可能想尝试在代码上运行SwiftLint。我经常发誓,特别是当它抱怨枚举开关的循环复杂性但确实改善了我的代码时。

答案 1 :(得分:0)

最有可能是一个错误,但我不需要封装。如果我不这样做,代码将按预期工作:

struct RowView: View {
    var body: some View {
        VStack{
            HStack{
                Spacer()
                    .foregroundColor(Color.black)
                Spacer()
            }

        }
        .background(Color.white)
        .cornerRadius(13)
        .padding()
    }
}

struct ContentView : View {
    @State var array: [String] = []
    @State var height: CGFloat = 60

    var body: some View {
        ScrollView{
            VStack{
                Text("d")
                    .frame(height: 90)

                VStack{
                    Button(action: {
                        self.array.append("Test")
                    }, label: {
                        Text("Add")
                    })

                    VStack{
                        ForEach(array, id: \.self){_ in
                            RowView()
                        }
                    }
                    .background(Color.red)
                    .cornerRadius(13)
                    .padding()
                }
            }
        }
        .navigationBarTitle("Test", displayMode: .automatic)
    }
}