SwiftUI স্ক্রোলভিউ আপডেট হচ্ছে না?


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

আমি এটি এক্সকোড 11.1, আইওএস 13.1, সুইফট 5 এ পরীক্ষা করেছি এবং প্রত্যাশিত ফলাফল পাচ্ছি (যদিও স্ক্রোলের ভিউ কেন্দ্রের চেয়ে শীর্ষে রয়েছে)।
sfung3

আপনার কীওয়ার্ডেরও দরকার নেইreturn
sfung3

আকর্ষণীয়, আমি
এক্সকোড

হ্যাঁ আমার আগে একটি printবিবৃতি ছিল, সুতরাংreturn
youjin

আমি এক্সকোড 11.2 এ আপডেট করব এবং আমি এটি পুনরুত্পাদন করতে পারি কিনা তা দেখুন। এটি কিছুটা সময় নিতে পারে তবে আমি আপনাকে আমার অনুসন্ধানে আপডেট করব।
sfung3

উত্তর:


10

এই সমস্যাটি সমাধান করার মতো হ্যাকিহীন উপায় হ'ল একটি আইএফ স্টেটমেন্টে স্ক্রোলভিউটি আবদ্ধ করা হয়েছে যা অ্যারেটি খালি রয়েছে কিনা তা পরীক্ষা করে দেখায়

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

দুর্ভাগ্যক্রমে এটি iOS 13.2 এ সিমুলেটারে কাজ করতে সক্ষম হয়নি
youjin

1

আমি খুঁজে পেয়েছি যে এটি কাজ করে (এক্সকোড ১১.২) যদি প্রত্যাশা অনুযায়ী রাজ্যটি কিছু মান দিয়ে খালি অ্যারে নয় তবে প্রাথমিকভাবে শুরু করে। এই ক্ষেত্রে আপডেটটি সঠিকভাবে কাজ করে এবং প্রাথমিক অবস্থার কোনও প্রভাব নেই।

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, সুতরাং ডামি ডেটা সহ স্ক্রোলভিউ শুরু করা সমস্যাযুক্ত হতে পারে
youjin

সঠিক, তবে এই পরিস্থিতিটি কোডগুলিতে যৌক্তিকভাবে পরিচালনা করা যেতে পারে, কারণ প্রাথমিক অবজেক্ট শর্তাধীন 'লোডিং' ইত্যাদির মতো কিছু দেখানোর জন্য কিছু সহজ-শনাক্ত করা-স্টাব হতে পারে me আমার পক্ষে এটি যথেষ্ট ছিল ... ভাগ করার মতো মূল্য।
Asperi

1

আমি খুঁজে পেয়েছি এমন একটি Rectangleহ্যাকি কাজটি হ'ল স্ক্রোলভিউয়ের অভ্যন্তরে একটি "অদৃশ্য" যুক্ত করা হবে যা ডাটাতে widthপ্রস্থের চেয়ে প্রস্থের চেয়ে বড় একটি মানকে সেট করে withscrollView

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.