SwiftUI ScrollView ไม่ได้รับการอัพเดต?


10

เป้าหมาย

รับข้อมูลที่จะแสดงใน scrollView

ผลลัพธ์ที่คาดหวัง

ข้อมูลที่แสดงใน scrollview

ผลลัพธ์ที่แท้จริง

มุมมองว่างเปล่า

ทางเลือก

ใช้Listแต่ไม่ยืดหยุ่น (ไม่สามารถลบตัวคั่นไม่สามารถมีหลายคอลัมน์ได้)

รหัส

struct Object: Identifiable {
    var id: String
}

struct Test: View {
    @State var array = [Object]()

    var body: some View {
//        return VStack { // uncomment this to see that it works perfectly fine
        return ScrollView(.vertical) {
            ForEach(array) { o in
                Text(o.id)
            }
        }
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}

ฉันทดสอบสิ่งนี้ใน Xcode 11.1, iOS 13.1, Swift 5 และได้รับผลลัพธ์ที่คาดหวัง (แม้ว่ามุมมองเลื่อนจะอยู่ด้านบนแทนที่จะอยู่ตรงกลาง)
sfung3

คุณไม่ต้องการคำหลักreturn
sfung3

ที่น่าสนใจฉันใช้ Xcode 11.2, iOS 13.2, Swift 5
youjin

ใช่ฉันมีprintคำสั่งก่อนหน้านี้ดังนั้นreturn
youjin

ฉันจะอัปเดตเป็น Xcode 11.2 และดูว่าฉันจะทำซ้ำได้ไหม อาจใช้เวลาสักครู่ แต่ฉันจะอัปเดตคุณในสิ่งที่ฉันค้นพบ
sfung3

คำตอบ:


10

วิธีที่ไม่แฮ็กที่จะแก้ไขปัญหานี้คือการใส่ ScrollView ในคำสั่ง IF ที่จะตรวจสอบว่าอาร์เรย์ว่างเปล่าหรือไม่

if !self.array.isEmpty{
     ScrollView(.vertical) {
          ForEach(array) { o in
               Text(o.id)
          }
     }
}

วิธีแก้ปัญหานี้สมบูรณ์แบบขอบคุณ!
Hendrik

1

พฤติกรรมที่คาดหวังเกิดขึ้นXcode 11.1แต่ไม่เปิดXcode 11.2.1

ฉันเพิ่มโมดิframeฟายเออร์ในสิ่งScrollViewที่ทำให้ScrollViewปรากฏ

struct Object: Identifiable {
    var id: String
}

struct ContentView: View {
    @State var array = [Object]()

    var body: some View {
        ScrollView(.vertical) {
            ForEach(array) { o in
                Text(o.id)
            }
        }
        .frame(height: 40)
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}

น่าเสียดายที่ไม่สามารถใช้งานได้บน iOS 13.2 บน Simulator
youjin

1

ฉันพบว่ามันใช้งานได้ (Xcode 11.2) ตามที่คาดไว้หากสถานะเริ่มต้นด้วยค่าบางอย่างไม่ใช่อาร์เรย์ว่าง ในกรณีนี้การอัปเดตทำงานอย่างถูกต้องและสถานะเริ่มต้นไม่มีผลกระทบ

struct TestScrollViewOnAppear: View {
    @State var array = [Object(id: "1")]

    var body: some View {
        ScrollView(.vertical) {
            ForEach(array) { o in
                Text(o.id)
            }
        }
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}

ที่ใช้งานได้กับกรณีง่าย ๆ ในกรณีของฉันฉันมีการโทรผ่านเครือข่ายonAppearดังนั้นการเริ่มต้น scrollView ด้วยข้อมูลดัมมี่อาจเป็นปัญหา
youjin

ถูกต้อง แต่สถานการณ์นี้สามารถจัดการได้อย่างมีเหตุมีผลในรหัสเพราะวัตถุเริ่มต้นสามารถตรวจจับได้ง่าย ๆ เพื่อแสดงเงื่อนไขบางอย่างเช่น 'กำลังโหลด' ฯลฯ .. สำหรับฉันนี่ก็เพียงพอแล้ว ... คุ้มค่าที่จะแบ่งปัน
Asperi

1

วิธีแก้ปัญหาหนึ่งที่ฉันพบคือการเพิ่ม "ล่องหน" Rectangleใน scrollView ด้วยการwidthตั้งค่าเป็นค่าที่มากกว่าความกว้างของข้อมูลในscrollView

struct Object: Identifiable {
    var id: String
}

struct ContentView: View {
    @State var array = [Object]()

    var body: some View {
        GeometryReader { geometry in
            ScrollView(.vertical) {
                Rectangle()
                    .frame(width: geometry.size.width, height: 0.01)
                ForEach(array) { o in
                    Text(o.id)
                }
            }
        }
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.