সুইফটআইআই - দৃশ্যে হার্ডকডযুক্ত নেভিগেশন এড়াতে কীভাবে?


33

আমি একটি বড়, উত্পাদন প্রস্তুত সুইফটইউআই অ্যাপের জন্য আর্কিটেকচার করার চেষ্টা করি। আমি সবসময় একই সমস্যাটিতে চলেছি যা সুইফটইউআইয়ের একটি প্রধান নকশার ত্রুটির দিকে নির্দেশ করে।

তবুও কেউ আমাকে পুরো কাজ, উত্পাদন প্রস্তুত উত্তর দিতে পারেনি।

SwiftUIন্যাভিগেশন রয়েছে যাতে পুনরায় ব্যবহারযোগ্য দর্শনগুলি কীভাবে করবেন ?

যেহেতু SwiftUI NavigationLinkদৃ strongly়তার সাথে দৃ .়ভাবে আবদ্ধ হয় এটি কেবল এমনভাবে সম্ভব নয় যে এটি বড় অ্যাপগুলিতেও স্কেল করে। NavigationLinkএই ছোট্ট নমুনায় অ্যাপ্লিকেশনগুলি কাজ করে, হ্যাঁ - তবে আপনি একবারে একটি অ্যাপ্লিকেশনে অনেকগুলি ভিউ পুনরায় ব্যবহার করতে চান না। এবং মডিউল সীমানা আবার ব্যবহার করতে পারেন। (যেমন: আইওএস, ওয়াচওএস ইত্যাদিতে ভিউ পুনরায় ব্যবহার করুন ...)

ডিজাইনের সমস্যা: নেভিগেশনলিঙ্কগুলি ভিউতে হার্ডকোডযুক্ত।

NavigationLink(destination: MyCustomView(item: item))

তবে এতে থাকা ভিউটি যদি NavigationLinkপুনরায় ব্যবহারযোগ্য হয় তবে আমি গন্তব্যটিকে হার্ডকোড করতে পারি না । গন্তব্য সরবরাহ করে এমন একটি ব্যবস্থা থাকতে হবে। আমি এটি এখানে জিজ্ঞাসা করেছি এবং বেশ ভাল উত্তর পেয়েছি, তবে এখনও পুরো উত্তরটি নেই:

সুইফটুআই এমভিভিএম সমন্বয়ক / রাউটার / নেভিগেশনলিঙ্ক

ধারণাটি ছিল পুনরায় ব্যবহারযোগ্য দৃশ্যে গন্তব্য লিঙ্কগুলি ইনজেক্ট করা। সাধারণত ধারণাটি কাজ করে তবে দুর্ভাগ্যক্রমে এটি বাস্তব প্রোডাকশন অ্যাপ্লিকেশনগুলিতে স্কেল হয় না। আমার একাধিক পুনঃব্যবহারযোগ্য পর্দা পাওয়ার সাথে সাথে আমি লজিক্যাল সমস্যাটিতে চলে আসি যে একটি পুনরায় ব্যবহারযোগ্য দর্শন ( ViewA) এর পূর্ব -কনফিগার করা ভিউ-গন্তব্য ( ViewB) দরকার। তবে কী যদি ViewBপূর্ব-কনফিগার্ড দর্শন-গন্তব্য প্রয়োজন ViewC? আমার ViewBআগে থেকেই এমনভাবে তৈরি করা দরকার যা আমি ইনজেকশন দেওয়ার আগেই ViewCইতিমধ্যে ইনজেকশনে ViewBফেলেছি । এবং এইভাবেই .... তবে সেই সময়ে যে ডেটাটি পাস করতে হয়েছিল সেগুলি সম্পূর্ণ নির্মাণ ব্যর্থ হয় না।ViewBViewA

আমার আরেকটি ধারণা ছিল Environmentগন্তব্যগুলি ইনজেক্ট করার জন্য নির্ভরতা ইনজেকশন প্রক্রিয়া হিসাবে ব্যবহার করা NavigationLink। তবে আমি মনে করি এটিকে কম বেশি হ্যাক হিসাবে বিবেচনা করা উচিত এবং বড় অ্যাপ্লিকেশনগুলির জন্য কোনও স্কেলযোগ্য সমাধান নয়। আমরা প্রতিটি কিছুর জন্য মূলত পরিবেশটি ব্যবহার করব। তবে পরিবেশটি কেবলমাত্র ভিউ-এর অভ্যন্তরে ব্যবহার করা যেতে পারে (পৃথক সমন্বয়কারী বা ভিউমোডেলগুলিতে নয়) এটি আমার মতে আবারও অদ্ভুত গঠন তৈরি করতে পারে।

ব্যবসায়ের যুক্তি (যেমন দেখুন মডেল কোড দেখুন) এবং দর্শনকে পৃথক করতে হবে নেভিগেশন এবং ভিউও পৃথক করতে হবে (উদাহরণস্বরূপ সমন্বয়কারী প্যাটার্ন) UIKitএটি সম্ভব হওয়ার কারণে আমরা ভিউতে UIViewControllerএবং এর UINavigationControllerপিছনে প্রবেশ করি । UIKit'sএমভিসির ইতিমধ্যে সমস্যা ছিল যে এটি এতগুলি ধারণা ছিন্ন করেছে যে এটি "মডেল-ভিউ-কন্ট্রোলার" এর পরিবর্তে মজাদার নাম "ম্যাসিভ-ভিউ-কন্ট্রোলার" হয়ে যায়। এখন একই ধরণের সমস্যা অব্যাহত রয়েছে SwiftUIতবে আমার মতে আরও খারাপ। নেভিগেশন এবং দর্শনগুলি দৃ strongly়ভাবে মিলিত হয়েছে এবং ডিকোপল করা যায় না। সুতরাং সেগুলিতে নেভিগেশন থাকলে পুনরায় ব্যবহারযোগ্য দর্শনগুলি করা সম্ভব নয়। এটি সমাধান করা সম্ভব ছিল UIKitকিন্তু এখন আমি এর মধ্যে কোনও মীমাংসা সমাধান দেখতে পাচ্ছি নাSwiftUI। দুর্ভাগ্যক্রমে অ্যাপল কীভাবে এর মতো আর্কিটেকচার সংক্রান্ত সমস্যাগুলি সমাধান করবেন তা আমাদের কোনও ব্যাখ্যা সরবরাহ করেন নি। আমরা পেয়েছি মাত্র কয়েকটি ছোট নমুনা অ্যাপ্লিকেশন।

আমি ভুল প্রমাণিত হতে চাই। দয়া করে আমাকে একটি পরিষ্কার অ্যাপ্লিকেশন ডিজাইনের প্যাটার্ন দেখান যা এটি বড় উত্পাদনের জন্য প্রস্তুত অ্যাপসের জন্য সমাধান করে।

আগাম ধন্যবাদ.


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


1
একমত! আমি অনেক মাস আগে "ফিডব্যাক সহায়ক" এ এর ​​জন্য একটি অনুরোধ তৈরি করেছি, এখনও কোনও প্রতিক্রিয়া নেই: gist.github.com/Sajjon/b7edb4cc11bcb6462f4e28dc170be245
সাজজন

@ সাজ্জুন ধন্যবাদ! আমি অ্যাপলটিও লিখতে চাইছি, আসুন দেখুন আমি কোনও প্রতিক্রিয়া পাই কিনা।
ডার্কো

1
এ প্রসঙ্গে অ্যাপলকে একটি চিঠি লিখেছিল। দেখা যাক আমরা একটি প্রতিক্রিয়া পাই কিনা।
ডার্কো

1
নিস! এটি ডাব্লুডাব্লুডিসির সময় পর্যন্ত সেরা উপস্থিত হবে!
সাজজন

উত্তর:


10

বন্ধটি আপনার যা প্রয়োজন!

struct ItemsView<Destination: View>: View {
    let items: [Item]
    let buildDestination: (Item) -> Destination

    var body: some View {
        NavigationView {
            List(items) { item in
                NavigationLink(destination: self.buildDestination(item)) {
                    Text(item.id.uuidString)
                }
            }
        }
    }
}

আমি সুইফটইউতে ডেলিগেট প্যাটার্নটি ক্লোজার দিয়ে প্রতিস্থাপন সম্পর্কে একটি পোস্ট লিখেছিলাম। https://swiftwithmajid.com/2019/11/06/the-power-of-closures-in-swiftui/


বন্ধটি একটি ভাল ধারণা, ধন্যবাদ! তবে কীভাবে এটি একটি গভীর দৃশ্যের শ্রেণিবিন্যাসের মতো দেখাবে? কল্পনা করুন আমার একটি নেভিগেশন ভিউ রয়েছে যা 10 স্তরের গভীরতর, বিশদভাবে, বিস্তারিতভাবে, বিস্তারিতভাবে ইত্যাদি ...
ডার্কো

আমি আপনাকে কেবল তিনটি স্তরের গভীরের কিছু সাধারণ উদাহরণ কোড প্রদর্শন করতে আমন্ত্রণ জানাতে চাই।
ডার্কো

7

আমার ধারণাটি অনেকটা Coordinatorএবং Delegateপ্যাটার্নের সংমিশ্রণ হবে । প্রথমে একটি Coordinatorশ্রেণী তৈরি করুন :


struct Coordinator {
    let window: UIWindow

      func start() {
        var view = ContentView()
        window.rootViewController = UIHostingController(rootView: view)
        window.makeKeyAndVisible()
    }
}

SceneDelegateব্যবহার করতে অভিযোজন করুন Coordinator:

  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let coordinator = Coordinator(window: window)
            coordinator.start()
        }
    }

ভিতরে ContentView, আমরা এই আছে:


struct ContentView: View {
    var delegate: ContentViewDelegate?

    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: delegate!.didSelect(Item())) {
                    Text("Destination1")
                }
            }
        }
    }
}

আমরা ContenViewDelegateএই জাতীয় প্রোটোকলটি সংজ্ঞায়িত করতে পারি :

protocol ContentViewDelegate {
    func didSelect(_ item: Item) -> AnyView
}

যেখানে Itemকেবল একটি কাঠামো যা শনাক্তযোগ্য, অন্য যে কোনও কিছু হতে পারে (যেমন TableViewইউআইকিট-এর মতো কোনও উপাদানগুলির আইডি )

পরবর্তী পদক্ষেপটি হ'ল এই প্রোটোকলটি গ্রহণ করা Coordinatorএবং আপনি যে ভিউটি উপস্থাপন করতে চান তা কেবল পাস করুন:

extension Coordinator: ContentViewDelegate {
    func didSelect(_ item: Item) -> AnyView {
        AnyView(Text("Returned Destination1"))
    }
}

এটি এখনও পর্যন্ত আমার অ্যাপ্লিকেশনগুলিতে দুর্দান্তভাবে কাজ করেছে। আমি আসা করি এটা সাহায্য করবে.


নমুনা কোডের জন্য ধন্যবাদ। আমি আপনাকে এই জাতীয় Text("Returned Destination1")কিছুতে পরিবর্তন করতে আমন্ত্রণ জানাতে চাই MyCustomView(item: ItemType, destinationView: View)। সুতরাং এর MyCustomViewজন্য কিছু ডেটা এবং গন্তব্য ইনজেকশন প্রয়োজন। কীভাবে সমাধান করবেন?
ডার্কো

আপনি আমার পোষ্টে যা নীড়ের সমস্যাটি বর্ণনা করেছেন তা দৌড়াদৌড়ি করছেন। আমি ভুল হলে আমাকে সংশোধন করুন। মূলত এই পদ্ধতির কাজ করে যদি আপনার একটি পুনরায় ব্যবহারযোগ্য দর্শন থাকে এবং সেই পুনরায় ব্যবহারযোগ্য দৃশ্যে নেভিগেশনলিঙ্কের সাথে অন্য পুনরায় ব্যবহারযোগ্য ভিউ না থাকে। যা বেশ সাধারণ ব্যবহারের ক্ষেত্রে তবে বড় অ্যাপ্লিকেশনে স্কেল হয় না। (যেখানে প্রায় প্রতিটি দৃশ্য পুনরায় ব্যবহারযোগ্য)
ডার্কো

এটি আপনার অ্যাপের নির্ভরতা এবং তাদের প্রবাহকে কীভাবে পরিচালনা করে তার উপর এটি অত্যন্ত নির্ভর করে। আপনার যদি কোনও একক স্থানে নির্ভরতা থাকে, যেমন আপনার আইএমও করা উচিত (এটি রচনা মূল হিসাবেও পরিচিত), আপনার এই সমস্যাটি দেখা উচিত নয়।
নিকোলা মাতিজেভিক

প্রোটোকল হিসাবে দেখার জন্য যা আমার পক্ষে কাজ করে তা আপনার সমস্ত নির্ভরতা নির্ধারণ করে। সংমিশ্রনের মূলের মধ্যে প্রোটোকলে কনফারেন্স যুক্ত করুন। সমন্বয়কের উপর নির্ভরতা পাস করুন। সমন্বয়কারী থেকে তাদের ইনজেকশন। তত্ত্ব অনুসারে, আপনার তিনটি বেশি পরামিতি শেষ হওয়া উচিত, যদি সঠিকভাবে না করা হয় dependenciesএবং কখনও কখনও না destination
নিকোলা মাতিজেভিক

1
আমি একটি দৃ concrete় উদাহরণ দেখতে চাই। আমি ইতিমধ্যে উল্লিখিত হিসাবে, এর শুরু করা যাক Text("Returned Destination1")। এটির যদি দরকার হয় তবে একটি MyCustomView(item: ItemType, destinationView: View)। আপনি সেখানে কি ইনজেকশন করতে যাচ্ছেন? আমি নির্ভরতা ইনজেকশন, প্রোটোকলের মাধ্যমে শিথিল কাপলিং এবং সমন্বয়কারীদের সাথে ভাগ করে নেওয়া নির্ভরতা বুঝতে পারি। সব কিছুই সমস্যা নয় - এটি প্রয়োজনীয় বাসা বাঁধে। ধন্যবাদ।
ডার্কো

2

আমার সাথে কিছু ঘটে যা আপনি যখন বলেন:

তবে ভিউবি-র যদি পূর্ব-কনফিগার করা ভিউ-গন্তব্য ভিউসি দরকার হয় তবে কী হবে? আমার ভিউবিতে ভিউ ইনজেক্ট করার আগে ভিউবিতে ইতিমধ্যে এমনভাবে তৈরি করা দরকার যাতে ভিউসি ইতিমধ্যে ভিউবিতে ইনজেকশনে থাকে। এবং এইভাবেই .... তবে সেই সময়ে যে ডেটাটি পাস করতে হয়েছিল সেগুলি সম্পূর্ণ নির্মাণ ব্যর্থ হয় না।

এটা একেবারে সত্য নয়। ভিউ সরবরাহ করার পরিবর্তে, আপনি আপনার পুনরায় ব্যবহারযোগ্য উপাদানগুলি ডিজাইন করতে পারেন যাতে আপনি ক্লোজার সরবরাহ করেন যা চাহিদার উপর দৃষ্টিভঙ্গি সরবরাহ করে।

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


কিন্তু এই জাতীয় "ক্লোজার-ট্রি" সৃষ্টি কীভাবে বাস্তব মতামত থেকে পৃথক হয়? সমস্যা সরবরাহকারী আইটেমটি সমাধান করা হবে, তবে প্রয়োজনীয় বাসা বাঁধবে না। আমি একটি ক্লোজার তৈরি করি যা একটি দৃশ্য তৈরি করে - ঠিক আছে। তবে সেই বন্ধে আমার ইতিমধ্যে পরবর্তী বন্ধের সৃষ্টি সরবরাহ করতে হবে। এবং শেষ এক পরের। ইত্যাদি ... তবে আমি আপনাকে ভুল বুঝতে পারি। কিছু কোড উদাহরণ সাহায্য করবে। ধন্যবাদ।
ডার্কো

2

এখানে অসীমভাবে ড্রিল করার এবং প্রোগ্রামের মাধ্যমে পরবর্তী বিশদ দেখার জন্য আপনার ডেটা পরিবর্তন করার একটি মজাদার উদাহরণ

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var navigationManager: NavigationManager

    var body: some View {
        NavigationView {
            DynamicView(viewModel: ViewModel(message: "Get Information", type: .information))
        }
    }
}

struct DynamicView: View {
    @EnvironmentObject var navigationManager: NavigationManager

    let viewModel: ViewModel

    var body: some View {
        VStack {
            if viewModel.type == .information {
                InformationView(viewModel: viewModel)
            }
            if viewModel.type == .person {
                PersonView(viewModel: viewModel)
            }
            if viewModel.type == .productDisplay {
                ProductView(viewModel: viewModel)
            }
            if viewModel.type == .chart {
                ChartView(viewModel: viewModel)
            }
            // If you want the DynamicView to be able to be other views, add to the type enum and then add a new if statement!
            // Your Dynamic view can become "any view" based on the viewModel
            // If you want to be able to navigate to a new chart UI component, make the chart view
        }
    }
}

struct InformationView: View {
    @EnvironmentObject var navigationManager: NavigationManager
    let viewModel: ViewModel

    // Customize your  view based on more properties you add to the viewModel
    var body: some View {
        VStack {
            VStack {
                Text(viewModel.message)
                .foregroundColor(.white)
            }
            .frame(width: 300, height: 300)
            .background(Color.blue)


            NavigationLink(destination: navigationManager.destination(forModel: viewModel)) {
                Text("Navigate")
            }
        }
    }
}

struct PersonView: View {
    @EnvironmentObject var navigationManager: NavigationManager
    let viewModel: ViewModel

    // Customize your  view based on more properties you add to the viewModel
    var body: some View {
        VStack {
            VStack {
                Text(viewModel.message)
                .foregroundColor(.white)
            }
            .frame(width: 300, height: 300)
            .background(Color.red)
            NavigationLink(destination: navigationManager.destination(forModel: viewModel)) {
                Text("Navigate")
            }
        }
    }
}

struct ProductView: View {
    @EnvironmentObject var navigationManager: NavigationManager
    let viewModel: ViewModel

    // Customize your  view based on more properties you add to the viewModel
    var body: some View {
        VStack {
            VStack {
                Text(viewModel.message)
                    .foregroundColor(.white)
            }
            .frame(width: 300, height: 300)
            .background(Color.green)
            NavigationLink(destination: navigationManager.destination(forModel: viewModel)) {
                Text("Navigate")
            }
        }
    }
}

struct ChartView: View {
    @EnvironmentObject var navigationManager: NavigationManager
    let viewModel: ViewModel

    var body: some View {
        VStack {
            VStack {
                Text(viewModel.message)
                    .foregroundColor(.white)
            }
            .frame(width: 300, height: 300)
            .background(Color.green)
            NavigationLink(destination: navigationManager.destination(forModel: viewModel)) {
                Text("Navigate")
            }
        }
    }
}

struct ViewModel {
    let message: String
    let type: DetailScreenType
}

enum DetailScreenType: String {
    case information
    case productDisplay
    case person
    case chart
}

class NavigationManager: ObservableObject {
    func destination(forModel viewModel: ViewModel) -> DynamicView {
        DynamicView(viewModel: generateViewModel(context: viewModel))
    }

    // This is where you generate your next viewModel dynamically.
    // replace the switch statement logic inside with whatever logic you need.
    // DYNAMICALLY MAKE THE VIEWMODEL AND YOU DYNAMICALLY MAKE THE VIEW
    // You could even lead to a view with no navigation link in it, so that would be a dead end, if you wanted it.
    // In my case my "context" is the previous viewMode, by you could make it something else.
    func generateViewModel(context: ViewModel) -> ViewModel {
        switch context.type {
        case .information:
            return ViewModel(message: "Serial Number 123", type: .productDisplay)
        case .productDisplay:
            return ViewModel(message: "Susan", type: .person)
        case .person:
            return ViewModel(message: "Get Information", type: .chart)
        case .chart:
            return ViewModel(message: "Chart goes here. If you don't want the navigation link on this page, you can remove it! Or do whatever you want! It's all dynamic. The point is, the DynamicView can be as dynamic as your model makes it.", type: .information)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
        .environmentObject(NavigationManager())
    }
}

-> কিছু ভিউ আপনাকে সর্বদা মাত্র এক ধরণের দৃশ্যে ফিরে আসতে বাধ্য করে।
ডার্কো

এনভায়রনমেন্ট অবজেক্টের সাথে নির্ভরতা ইনজেকশন সমস্যার একটি অংশ সমাধান করে। তবে: কোনও ইউআই কাঠামোর ক্ষেত্রে গুরুত্বপূর্ণ এবং গুরুত্বপূর্ণ কিছু হওয়া উচিত?
ডারকো

আমি বোঝাতে চাইছি - যদি নির্ভরতার ইনজেকশনই এর একমাত্র সমাধান হয় তবে আমি অনিচ্ছুকভাবে এটি গ্রহণ করব। তবে এটি সত্যিই গন্ধ পাবে ...
ডার্কো

1
আপনি কেন আপনার কাঠামোর উদাহরণ সহ এটি ব্যবহার করতে পারেন তা আমি দেখতে পাচ্ছি না। আপনি যদি এমন কোনও ফ্রেমওয়ার্কের কথা বলছেন যা একটি অজানা দৃশ্যকে বিক্রেত করে আমি কল্পনা করব এটি কেবল কিছু দৃশ্য ফিরে আসতে পারে। আমিও যদি অবাক হব না যে কোনও নেভিগেশনলিংকের অভ্যন্তরীণ কোনও ভিভিও আসলে পিতামাতার দৃষ্টিভঙ্গি সন্তানের আসল বিন্যাস থেকে সম্পূর্ণ বিচ্ছিন্ন হওয়ার কারণে প্রিফ হিট না। আমি যদিও বিশেষজ্ঞ নই, এটি পরীক্ষা করতে হবে। প্রত্যেককে নমুনা কোডের জন্য জিজ্ঞাসা করার পরিবর্তে যেখানে তারা আপনার প্রয়োজনীয়তা পুরোপুরি বুঝতে পারে না আপনি কেন কোনও ইউআইকিট নমুনা লেখেন না এবং অনুবাদগুলি জিজ্ঞাসা করবেন না?
jasongregori

1
এই নকশাটি মূলত আমি (ইউআইকিট) অ্যাপটি কীভাবে কাজ করি। মডেলগুলি উত্পন্ন হয় যা অন্য মডেলের সাথে লিঙ্ক করে। একটি কেন্দ্রীয় সিস্টেম নির্ধারণ করে যে model মডেলের জন্য কোন ভিসিটি লোড করা উচিত এবং তারপরে পিতামাতার ভিসি এটিকে স্ট্যাকের উপরে ঠেলে দেয়।
jasongregori

2

আমি সুইফটইউতে এমভিপি + কোঅর্ডিনেটর পদ্ধতি তৈরির বিষয়ে একটি ব্লগ পোস্ট সিরিজ লিখছি যা কার্যকর হতে পারে:

https://lascorbe.com/posts/2020-04-27-MVPCoordinators-SwiftUI-part1/

সম্পূর্ণ প্রকল্পটি গিথুবে উপলভ্য: https://github.com/Lascorbe/SwiftUI-MVP- সমন্বয়কারী

আমি এটি করার চেষ্টা করছি যেন এটি স্কেলিবিলিটির দিক থেকে একটি বড় অ্যাপ্লিকেশন হয়। আমি মনে করি আমি নেভিগেশন সমস্যার সমাধান করেছি, তবে গভীরতর সংযোগ কীভাবে করব তা এখনও দেখতে হবে, যা বর্তমানে আমি কাজ করছি। আমি আসা করি এটা সাহায্য করবে.


বাহ, দুর্দান্ত, ধন্যবাদ! আপনি সুইফটউআই-তে সমন্বয়কারীকে কার্যকর করার ক্ষেত্রে বেশ ভাল কাজ করেছেন। NavigationViewমূল দৃশ্যটি তৈরি করার ধারণাটি দুর্দান্ত। এটি এখন পর্যন্ত সর্বাধিক উন্নত সুইফটইউআই সমন্বয়কারী বাস্তবায়ন saw
ডারকো

কেবলমাত্র আপনার সমন্বয়কারী সমাধানটি দুর্দান্ত হওয়ায় আমি আপনাকে অনুগ্রহ প্রদান করতে চাই। আমার একমাত্র সমস্যা - এটি আমার বর্ণনা করা সমস্যাটিকে সত্যিই সমাধান করে না। এটি ডিকুয়াল করে NavigationLinkতবে এটি একটি নতুন যুগল নির্ভরতা প্রবর্তনের মাধ্যমে তা করে। MasterViewআপনার উদাহরণে উপর নির্ভরশীল নয় NavigationButtonMasterViewএকটি সুইফ্ট প্যাকেজটিতে রাখার কল্পনা করুন - এটি আর সংকলন করবে না কারণ প্রকারটি NavigationButtonঅজানা। এছাড়াও আমি দেখতে পাচ্ছি না কীভাবে এটি পুনরায় ব্যবহারযোগ্য পুনরায় ব্যবহারযোগ্য সমস্যাটি Viewsসমাধান হবে?
ডারকো

আমি ভুল হতে পেরে খুশি হব এবং যদি আমি হয় তবে দয়া করে আমাকে এটি ব্যাখ্যা করুন। যদিও অনুগ্রহটি কয়েক মিনিটের মধ্যে শেষ হয়ে যায় আমি আশা করি কোনওভাবে আপনাকে পয়েন্টগুলি উপহার দিতে পারব। (এর আগে কখনও অনুগ্রহ করেনি, তবে আমি মনে করি যে আমি নতুন দিয়ে কেবল একটি ফলোআপ প্রশ্ন তৈরি করতে পারি?)
ডার্কো

1

এটি সম্পূর্ণরূপে আমার মাথার উত্তরের উত্তর, সুতরাং সম্ভবত বোকামি হয়ে উঠবে তবে আমি হাইব্রিড পদ্ধতির ব্যবহারে প্রলুব্ধ হব।

একক সমন্বয়কারী বস্তুর মধ্য দিয়ে যাওয়ার জন্য পরিবেশটি ব্যবহার করুন - এটিকে নেভিগেশনকর্ডিনেটর বলতে দিন।

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

গন্তব্য দর্শনটির জন্য নেভিগেশনকর্ডিনেটরের পুনরায় ব্যবহারযোগ্য দর্শনগুলি জিজ্ঞাসা করুন, তাদের সনাক্তকারী এবং তারা যে জাতীয় দৃষ্টিতে নেভিগেট করছেন তার শনাক্তকারীকে পাস করুন passing

এটি নেভিগেশনকর্ডিনেটরটিকে একটি একক ইনজেকশন পয়েন্ট হিসাবে রেখে দেয় এবং এটি একটি অদৃশ্য অবজেক্ট যা ভিউয়ের স্তরক্রমের বাইরেও অ্যাক্সেস করা যায়।

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

আরও জটিল ক্ষেত্রে আপনি একটি কাস্টম নিয়ামক লিখতে পারেন যা অন্যান্য অ্যাপ্লিকেশন-নির্দিষ্ট তথ্যের জন্য অ্যাকাউন্ট নেয়।

যেহেতু এটি পরিবেশের মাধ্যমে ইনজেকশন করা হয়েছে, তাই কোনও দৃশ্য যে কোনও বিন্দুতে ডিফল্ট নেভিগেশনকর্ডিনেটরকে ওভাররাইড করতে পারে এবং এর উপদর্শনগুলিতে আলাদা আলাদা সরবরাহ করতে পারে।

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