अद्यतन नहीं हो रहा है?


10

लक्ष्य

में प्रदर्शित करने के लिए डेटा प्राप्त करें 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, स्विफ्ट 5 पर इसका परीक्षण किया और अपेक्षित परिणाम प्राप्त कर रहा है (हालांकि स्क्रॉल दृश्य केंद्र के बजाय शीर्ष पर है)।
sfung3

आप कीवर्ड की जरूरत नहीं हैreturn
sfung3

दिलचस्प है, मैं Xcode 11.2, iOS 13.2, स्विफ्ट 5
youjin

हाँ, मैंने पहले एक printबयान दिया था, इसलिएreturn
youjin

मैं Xcode 11.2 को अपडेट करूंगा और देखूंगा कि क्या मैं इसे पुन: पेश कर सकता हूं। इसमें थोड़ी देर लग सकती है, लेकिन मैं आपको अपने निष्कर्षों पर अपडेट करूंगा।
sfung3

जवाबों:


10

इस समस्या को हल करने के लिए इतना आसान तरीका नहीं है कि स्क्रॉल विवरण को एक IF स्टेटमेंट में संलग्न करना है जो यह जांचता है कि क्या सरणी खाली है

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

यह समाधान सही है, धन्यवाद!
हेंड्रिक

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

दुर्भाग्य से इसे आईओएस 13.2 पर सिम्युलेटर में काम करने में सक्षम नहीं है
17

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, इसलिए डमी डेटा के साथ
स्क्रॉल दृश्य को

सही, लेकिन इस स्थिति को तार्किक रूप से कोड में संभाला जा सकता है, क्योंकि प्रारंभिक वस्तु सशर्त रूप से 'लोडिंग' आदि जैसे कुछ दिखाने के लिए कुछ आसान-पता लगाया जा सकता है .. मेरे लिए यह पर्याप्त था ... इसलिए साझा करने के लिए लायक है।
Asperi

1

मेरे द्वारा पाया गया एक हैसी वर्कअराउंड Rectangleस्क्रोल व्यू के अंदर एक "अदृश्य" जोड़ना है , जिसमें 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")]
        })
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.