SwiftUI ScrollView tidak diperbarui?


10

Tujuan

Dapatkan data untuk ditampilkan di a scrollView

Hasil yang diharapkan

data ditampilkan di scrollview

Hasil Aktual

pandangan kosong

Alternatif

gunakan List, tetapi tidak fleksibel (tidak dapat menghapus pemisah, tidak dapat memiliki beberapa kolom)

Kode

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

Saya menguji ini pada Xcode 11.1, iOS 13.1, Swift 5 dan saya mendapatkan hasil yang diharapkan (meskipun tampilan gulir di atas daripada di tengah).
sfung3

Anda juga tidak perlu kata kuncireturn
sfung3

menarik, saya di Xcode 11.2, iOS 13.2, Swift 5
youjin

ya saya punya printpernyataan sebelumnya, makareturn
Youjin

Saya akan memperbarui ke Xcode 11.2 dan melihat apakah saya dapat mereproduksi ini. Mungkin perlu waktu, tetapi saya akan memperbarui temuan saya.
sfung3

Jawaban:


10

Cara yang tidak terlalu rumit untuk mengatasi masalah ini adalah dengan melampirkan ScrollView dalam pernyataan IF yang memeriksa apakah array kosong

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

Solusi ini sempurna, terima kasih!
Hendrik

1

Perilaku yang diharapkan terjadi Xcode 11.1tetapi tidak aktifXcode 11.2.1

Saya menambahkan framepengubah ke ScrollViewyang membuat ScrollViewmuncul

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

Sayangnya tidak bisa menjalankannya di iOS 13.2 di Simulator
youjin

1

Saya telah menemukan bahwa itu berfungsi (Xcode 11.2) seperti yang diharapkan jika status diinisialisasi dengan beberapa nilai, bukan array kosong. Dalam hal ini, pemutakhiran berfungsi dengan benar dan keadaan awal tidak berpengaruh.

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

yang berfungsi untuk kasus sederhana, dalam kasus saya, saya memiliki panggilan jaringan onAppear, jadi menginisialisasi scrollView dengan data dummy mungkin bermasalah
Youjin

benar, tetapi situasi ini dapat ditangani secara logis dalam kode, karena objek awal dapat berupa beberapa rintisan yang mudah terdeteksi untuk menampilkan sesuatu seperti 'memuat' kondisional dll. bagi saya ini sudah cukup ... sangat layak untuk dibagikan.
Asperi

1

Salah satu solusi peretasan yang saya temukan adalah menambahkan "tidak terlihat" Rectangledi dalam scrollView, dengan nilai yang widthditetapkan lebih besar dari lebar data discrollView

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")]
        })
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.