SwiftUI এ একটি নতুন দর্শন উপস্থাপন করুন


11

আমি একটি বোতামে ক্লিক করতে চাই এবং তারপরে present modallyUIKit এর মতো একটি নতুন ভিউ উপস্থাপন করতে চাইএখানে চিত্র বর্ণনা লিখুন

আমি ইতিমধ্যে " শীট ব্যবহার করে কীভাবে একটি নতুন ভিউ উপস্থাপন করব " তা দেখেছি, তবে আমি এটিকে মডেল শীট হিসাবে মূল দৃশ্যে সংযুক্ত করতে চাই না।

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

আপনার সাহায্যের জন্য ধন্যবাদ...


কেন আপনি এটিকে মডেল শিট হিসাবে মূল দৃশ্যে সংযুক্ত করতে চান না? এটি এমনকি একটি মান পদ্ধতি UIKit। আপনার কোন বিশেষ কারণ আছে?
মোজতাবা হোসেইনি

আমি আমার চিন্তাভাবনাগুলি ব্যাখ্যা করার চেষ্টা করি ... যদি কিছু ভুল হয় তবে দয়া করে আমাকে সংশোধন করুন।
সিএচ উইং

অ্যাপ্লিকেশনগুলির 3 টি ভিউ, 1: লগইন পৃষ্ঠা 2: টেবিলভিউ পৃষ্ঠা 3: টেবিলদর্শন পৃষ্ঠা, টেবিলভিউ পৃষ্ঠা এবং সারণী বিবরণ পৃষ্ঠাটি নেভিগেশন সম্পর্কিত। লগইন টেবিলভিউ পৃষ্ঠায় উপস্থাপন করার পরে, টেবিলভিউ পৃষ্ঠার লগইন করার পরে লগইন পৃষ্ঠার সাথে কোনও সম্পর্ক নেই
সিএইচ উইং

সুতরাং আপনার এটি fullscreenঠিক হওয়া দরকার ?
মোজতাবা হোসেইনি

YS! আমি চাইfullscreen
সিএচ উইং

উত্তর:


12

একটি মডেল প্রদর্শন করতে (আইওএস 13 স্টাইল)

sheetনিজেকে খারিজ করার ক্ষমতা সহ আপনার কেবল একটি সরল প্রয়োজন :

struct ModalView: View {
    @Binding var presentedAsModal: Bool
    var body: some View {
        Button("dismiss") { self.presentedAsModal = false }
    }
}

এবং এটি উপস্থাপন করুন:

struct ContentView: View {
    @State var presentingModal = false

    var body: some View {
        Button("Present") { self.presentingModal = true }
        .sheet(isPresented: $presentingModal) { ModalView(presentedAsModal: self.$presentingModal) }
    }
}

নোট করুন যে আমি presentingModalমডেলে পাস করেছি যাতে আপনি এটি মডেল থেকেই খারিজ করতে পারেন তবে আপনি এ থেকে মুক্তি পেতে পারেন।


এটি সত্যই উপস্থিত করার জন্য fullscreen(কেবল দৃষ্টিভঙ্গি নয়)

আপনার অ্যাক্সেস করতে হবে ViewController। সুতরাং আপনার কিছু সহায়ক পাত্রে এবং পরিবেশের জিনিসগুলি দরকার:

struct ViewControllerHolder {
    weak var value: UIViewController?
}

struct ViewControllerKey: EnvironmentKey {
    static var defaultValue: ViewControllerHolder {
        return ViewControllerHolder(value: UIApplication.shared.windows.first?.rootViewController)

    }
}

extension EnvironmentValues {
    var viewController: UIViewController? {
        get { return self[ViewControllerKey.self].value }
        set { self[ViewControllerKey.self].value = newValue }
    }
}

তারপরে আপনার এই এক্সটেনশনটি প্রয়োগ করা উচিত:

extension UIViewController {
    func present<Content: View>(style: UIModalPresentationStyle = .automatic, @ViewBuilder builder: () -> Content) {
        let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
        toPresent.modalPresentationStyle = style
        toPresent.rootView = AnyView(
            builder()
                .environment(\.viewController, toPresent)
        )
        self.present(toPresent, animated: true, completion: nil)
    }
}

পরিশেষে

আপনি এটির fullscreenমতো করে তুলতে পারেন:

struct ContentView: View {
    @Environment(\.viewController) private var viewControllerHolder: UIViewController?

    var body: some View {
        Button("Login") {
            self.viewControllerHolder?.present(style: .fullScreen) {
                Text("Main") // Or any other view you like
            }
        }
    }
}

মহান! আপনার বিস্তারিত সমাধানের জন্য ধন্যবাদ
সিএইচ উইং

পরিবেশের সম্পত্তি র‌্যাপারে আমি এই ত্রুটিটি পেয়েছি: 'এনভায়রনমেন্ট <
ইউআইভিউ কনট্রোলার

এটি ডিফল্টরূপে পরিচালনা করা উচিত তবে ?সেখানে লাইনের শেষে যুক্ত করার চেষ্টা করুন । @jsbeginnerNodeJS
মোজতাবা হোসেইনি

যার দেখুন উইন্ডোটির শ্রেণীবিন্যাসে নয় `` আমি কনসোলে এই ত্রুটি পাবেন: `` সতর্কতা: বর্তমান <_TtGC7SwiftUI19UIHostingControllerVS_7AnyView_: 0x7fafd2641d30> এ প্রচেষ্টায় <0x7fafd2611bd0 _TtGC7SwiftUI19UIHostingControllerVS_7AnyView_>!
jsbeginnerNodeJS

আপনি কিভাবে এটি বরখাস্ত করবেন?
গ্যাব্রিলিপিত্ত্রি

0

এখানে একটি সহজ উপায় - ফরোয়ার্ড দর্শন। এটি খুব সোজা এগিয়ে।

        struct ChildView: View{
           private  let colors: [Color] = [.red, .yellow,.green,.white]
           @Binding var index : Int
           var body: some View {
           let next = (self.index+1)  % MyContainer.totalChildren
             return   ZStack{
                    colors[self.index  % colors.count]
                     Button("myNextView \(next)   ", action: {
                    withAnimation{
                        self.index = next
                    }
                    }
                )}.transition(.asymmetric(insertion: .move(edge: .trailing)  , removal:  .move(edge: .leading)  ))
            }
        }

        struct MyContainer: View {
            static var totalChildren = 10
            @State private var value: Int = 0
            var body: some View {
                    HStack{
                        ForEach(0..<(Self.totalChildren) ) { index in
                            Group{
                            if    index == self.value {
                                ChildView(index:  self.$value)
                                }}
                            }
                }
                }
        }

-1

দাবি অস্বীকার : নীচে সত্যই "নেটিভ মডেল" এর মতো নয়, আচরণ বা চেহারা বা অনুভূতিও নয়, তবে কারও যদি কেবলমাত্র শীর্ষের একজনকে সক্রিয় করে অন্য দৃষ্টিভঙ্গির একটি কাস্টম রূপান্তরের প্রয়োজন হয়, তবে নীচের পদ্ধতিটি সহায়ক হতে পারে।

সুতরাং, যদি আপনি নীচের মতো কিছু আশা করেন

কাস্টম SwiftUI মডেল

ডেমো পদ্ধতির জন্য একটি সহজ কোড এখানে রয়েছে (কর্স অ্যানিমেশন এবং রূপান্তর পরামিতিগুলি ইচ্ছার মাধ্যমে পরিবর্তন করা যেতে পারে)

struct ModalView : View {
    @Binding var activeModal: Bool
    var body : some View {
        VStack {
            Button(action: {
                withAnimation(.easeInOut(duration: 0.3)) {
                    self.activeModal = false
                }
            }) {
                Text("Hide modal")
            }
            Text("Modal View")
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Color.green)
    }
}

struct MainView : View {
    @Binding var activeModal: Bool
    var body : some View {
        VStack {
            Button(action: {
                withAnimation(.easeInOut(duration: 0.3)) {
                    self.activeModal = true
                }
            }) {
                Text("Show modal")
            }
            Text("Main View")
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Color.yellow)
    }
}

struct ModalContainer: View {
    @State var showingModal = false
    var body: some View {
        ZStack {
            MainView(activeModal: $showingModal)
                .allowsHitTesting(!showingModal)
            if showingModal {
                ModalView(activeModal: $showingModal)
                    .transition(.move(edge: .bottom))
                    .zIndex(1)
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.