首页 > 解决方案 > ScrollView 行为怪异(Xcode 11 GM 种子 - SwiftUI)

问题描述

我试图制作一个自定义列表。如果我们在 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)


}}

标签: swiftuiios13xcode11swiftui-list

解决方案


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

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。我经常对它发誓,尤其是当它抱怨我的枚举开关的圈复杂性时,但它确实改进了我的代码。


推荐阅读