【问题标题】:ScrollView acting weired (Xcode 11 GM seed - SwiftUI)ScrollView 行为怪异(Xcode 11 GM 种子 - SwiftUI)
【发布时间】:2019-09-13 02:11:05
【问题描述】:

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


}}

【问题讨论】:

    标签: swiftui ios13 xcode11 swiftui-list


    【解决方案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 缺少一个 Text 恕我直言,所以我放了一个。 ContentView 中的数组从未使用过,所以我删除了它,同样,navigatinBarTitle 需要一个 NavigationView。

    这并不是真正的答案,因为它使用 List 而不是 ScrollView,但它确实指出了您的问题所在。这也很奇怪,因为每件事都在一个列表行中,但我试图尽可能少地改变。

    您可能想尝试在您的代码上运行 SwiftLint。我经常对它发誓,尤其是当它抱怨我的枚举开关的圈复杂性时,但它确实改进了我的代码。

    【讨论】:

    • 谢谢。我认为这是目前唯一的方法。有没有办法改变列表分隔符的颜色?
    【解决方案2】:

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

    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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多