একাধিক পত্রক (isPremitted :) SwiftUI এ কাজ করে না


21

আমার কাছে এই কনটেন্টভিউটি দুটি পৃথক মডেল ভিউ রয়েছে, সুতরাং আমি sheet(isPresented:)উভয়ের জন্য ব্যবহার করছি তবে মনে হচ্ছে এটি কেবল শেষটি উপস্থাপিত হবে। আমি এই সমস্যাটি কীভাবে সমাধান করতে পারি? বা সুইফটইউআই-তে কোনও দৃশ্যে একাধিক পত্রক ব্যবহার করা সম্ভব নয় কি?

struct ContentView: View {

    @State private var firstIsPresented = false
    @State private var secondIsPresented = false

    var body: some View {

        NavigationView {
            VStack(spacing: 20) {
                Button("First modal view") {
                    self.firstIsPresented.toggle()
                }
                Button ("Second modal view") {
                    self.secondIsPresented.toggle()
                }
            }
            .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
            .sheet(isPresented: $firstIsPresented) {
                    Text("First modal view")
            }
            .sheet(isPresented: $secondIsPresented) {
                    Text("Only the second modal view works!")
            }
        }
    }
}

উপরের কোডটি সতর্কতা ছাড়াই সংকলন করে (এক্সকোড ১১.২.১)


আপনার কেবল একটি শীট থাকতে পারে। এই সমাধানটি দেখায় যে কীভাবে বিভিন্ন সতর্কতা থাকতে পারে যা আপনার অবস্থার সাথে সমান এবং সম্ভবত স্ট্যাকওভারফ্লো. com
অ্যান্ড্রু

উত্তর:


25

কোড নীচে চেষ্টা করুন

enum ActiveSheet {
   case first, second
}

struct ContentView: View {

    @State private var showSheet = false
    @State private var activeSheet: ActiveSheet = .first

    var body: some View {

        NavigationView {
            VStack(spacing: 20) {
                Button("First modal view") {
                    self.showSheet = true
                    self.activeSheet = .first
                }
                Button ("Second modal view") {
                    self.showSheet = true
                    self.activeSheet = .second
                }
            }
            .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
            .sheet(isPresented: $showSheet) {
                if self.activeSheet == .first {
                    Text("First modal view")
                }
                else {
                    Text("Only the second modal view works!")
                }
            }
        }
    }
}

1
এই সমাধানটি বোঝায় এবং স্কেল করতে পারে, ধন্যবাদ!
টিউরিংস্টেড

পরিবর্তে যদি ... এর পরিবর্তে এই কোডটি স্যুইচ স্টেটমেন্ট দিয়ে চেষ্টা করা হয়েছে এবং ত্রুটিটি পেয়েছে "ফাংশন বিল্ডার 'ভিউবিল্ডার' এর সাথে" নিয়ন্ত্রণ প্রবাহ বিবরণী সমাপ্ত ক্লোজারটি ব্যবহার করা যাবে না যা হতবাক হয়েছিল কারণ যদি না ... অন্যথায় নিয়ন্ত্রণ প্রবাহ হয়?
অ্যারন সুরেন

ধন্যবাদ! এই সমাধানটি কাজ করে
অ্যাডেলমার

আপনার শিটভিউগুলির একই ধরণের রয়েছে: পাঠ্য, বিভিন্ন ধরণের সম্পর্কে কী? যতদূর আমি দেখছি, এটি কাজ করছে না।
কোয়াং Hà

@ কোয়াংএইএর জন্য আপনাকে অন্য উপায়ে করতে হবে। অথবা আপনি যে ভিন্ন ভিন্ন দৃষ্টিভঙ্গি হিসাবে দুটি বা আরও বেশি শিটভিউ নিতে পারেন
রোহিত

11

আপনার কেসটি নিম্নলিখিত দ্বারা সমাধান করা যেতে পারে (এক্সকোড ১১.২ দিয়ে পরীক্ষিত)

var body: some View {

    NavigationView {
        VStack(spacing: 20) {
            Button("First modal view") {
                self.firstIsPresented.toggle()
            }
            .sheet(isPresented: $firstIsPresented) {
                    Text("First modal view")
            }
            Button ("Second modal view") {
                self.secondIsPresented.toggle()
            }
            .sheet(isPresented: $secondIsPresented) {
                    Text("Only the second modal view works!")
            }
        }
        .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
    }
}

আমার কাছে একটি সতর্কতা তবে একাধিক বিল রয়েছে যা মিথ্যা তবে একবারে সত্য (দেহের বাইরে) তবে আমি আমার সতর্কতাটি জানতে চাই যে কোন বুল সত্য এবং একটি নির্দিষ্ট সতর্কতা প্রদর্শন করতে
দেওয়ান

6

ভিউটির পটভূমিতে রাখা খালি ভিউতেও শীটটি যুক্ত করতে পারে। এটি একাধিকবার করা যেতে পারে:

  .background(EmptyView()
        .sheet(isPresented: isPresented, content: content))

3

আপনি একসাথে বোতাম এবং। পত্রক কলকে গ্রুপবদ্ধ করে এটি সাধন করতে পারেন। আপনার যদি একটি নেতৃস্থানীয় এবং একটি অনুসরণ করে থাকে তবে তা সহজ। তবে, যদি আপনার নেতৃস্থানীয় বা পিছনে হয় একাধিক নেভিগেশনসাইট থাকে তবে আপনাকে সেগুলি একটি এইচস্ট্যাকের মধ্যে আবৃত করতে হবে এবং প্রতিটি বোতামটি তার শীট কলটি একটি ভিস্ট্যাকের সাথে আবৃত করতে হবে।

এখানে দুটি পিছনের বোতামের উদাহরণ রয়েছে:

            trailing:
            HStack {
                VStack {
                    Button(
                        action: {
                            self.showOne.toggle()
                    }
                    ) {
                        Image(systemName: "camera")
                    }
                    .sheet(isPresented: self.$showOne) {
                        OneView().environment(\.managedObjectContext, self.managedObjectContext)
                    }
                }//showOne vstack

                VStack {
                    Button(
                        action: {
                            self.showTwo.toggle()
                    }
                    ) {
                        Image(systemName: "film")
                    }
                    .sheet(isPresented: self.$showTwo) {
                        TwoView().environment(\.managedObjectContext, self.managedObjectContext)
                    }
                }//show two vstack
            }//nav bar button hstack

1

রোহিত মাকওয়ানার জবাব ছাড়াও , আমি কোনও ফাংশনে শীট সামগ্রীটি বের করার একটি উপায় খুঁজে পেয়েছি কারণ সংকলকটি আমার বিশাল দৈনিকটি টাইপ করে যাচ্ছিল View

extension YourView {
    enum Sheet {
        case a, b
    }

    @ViewBuilder func sheetContent() -> some View {
        if activeSheet == .a {
            A()
        } else if activeSheet == .b {
            B()
        }
    }
}

আপনি এটি এইভাবে ব্যবহার করতে পারেন:

.sheet(isPresented: $isSheetPresented, content: sheetContent)

এটি কোডকে আরও পরিষ্কার করে তোলে এবং আপনার সংকলকটির চাপকেও মুক্তি দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.