SwiftUI ScrollView güncellenmiyor mu?


10

Hedef

Görüntülenecek verileri alın scrollView

Beklenen Sonuç

kaydırma görünümünde gösterilen veriler

Gerçek sonuç

boş bir görünüm

Alternatif

kullanımı List, ancak esnek değildir (ayıraçlar kaldıramaz, birden çok sütun olamaz)

kod

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

Bunu Xcode 11.1, iOS 13.1, Swift 5 üzerinde test ettim ve beklenen sonucu alıyorum (kaydırma görünümü merkezden ziyade üstte olmasına rağmen).
sfung3

Ayrıca anahtar kelimeye ihtiyacınız yokreturn
sfung3

ilginç, Xcode 11.2, iOS 13.2, Swift 5 kullanıyorum
youjin

evet daha printönce bir açıklama vardı , bu nedenlereturn
youjin

Xcode 11.2'ye güncelleyeceğim ve bunu yeniden yapıp yapamayacağımı göreceğim. Biraz zaman alabilir, ancak bulgularımı güncelleyeceğim.
sfung3

Yanıtlar:


10

Bu soruna geçici bir çözüm bulmak için dizinin boş olup olmadığını kontrol eden bir IF deyimine ScrollView dahil etmektir

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

Bu geçici çözüm mükemmel, teşekkürler!
Hendrik

1

Beklenen davranış gerçekleşir, Xcode 11.1ancak gerçekleşmezXcode 11.2.1

Bir ilave frameetmek değiştirici ScrollViewyapmak hangi ScrollViewgörünür

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

Ne yazık ki Simulator üzerinde iOS 13.2 üzerinde
çalışamıyor

1

Durum boş bir dizi değil, bazı değer ile başlatılırsa beklendiği gibi (Xcode 11.2) çalışır bulduk. Bu durumda güncelleme düzgün çalışır ve başlangıç ​​durumunun bir etkisi olmaz.

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

Bu basit durumda işe yarar, benim durumumda bir ağ onAppearçağrım var, bu nedenle kukla verilerle scrollView'i başlatmak sorunlu olabilir
youjin

doğru, ancak bu durum kod olarak mantıksal olarak ele alınabilir, çünkü başlangıç ​​nesnesi 'yükleme' vb. gibi koşullu olarak göstermek için bazı kolay tespit edilen saplama olabilir.
Asperi

1

Bulduğum hacky geçici bir çözüm Rectangle, scrollView içine "görünmez" , widthkümedeki verilerin genişliğinden daha büyük bir değere ayarlanmasıdır.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")]
        })
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.