NavigationLink হল SwiftUI-তে একটি নিয়ন্ত্রণ উপাদান যা NavigationStack বা NavigationView-তে অন্য স্ক্রিনে ট্রানজিশনের জন্য ডিজাইন করা হয়েছে। Apple Developer Documentation, 2024 অনুসারে, NavigationLink একটি বাটন তৈরি করে যা চাপলে লক্ষ্য View নেভিগেশন স্ট্যাকে স্থাপন করা হয়। iOS 16+ এ লক্ষ্য Views-এর অকাল ইনিশিয়ালাইজেশন এড়াতে সরাসরি destination-এর পরিবর্তে value এবং NavigationDestination-এর সাথে NavigationLink ব্যবহার করার পরামর্শ দেওয়া হয়।
মূল বিষয়
NavigationLink একটি View যা চাপলে নেভিগেশন ট্রানজিশন শুরু করে। NavigationStack-এর ভিতরে, NavigationLink চাপলে লক্ষ্য স্ক্রিন স্ট্যাকে স্থাপন করে এবং সিস্টেমের পিছনে বাটন প্রদর্শন করে। NavigationLink iOS 13 থেকে বিদ্যমান এবং SwiftUI-তে ব্যবহারকারী নেভিগেশনের প্রাথমিক পদ্ধতি।
NavigationLink UIButton থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয় — এটি একটি SwiftUI View যা স্বয়ংক্রিয়ভাবে প্রসঙ্গের সাথে খাপ খায়। List-এর ভিতরে, NavigationLink একটি প্রকাশক নির্দেশক সহ প্রদর্শিত হয়। তালিকার বাইরে, NavigationLink একটি সাধারণ বাটনের মতো আচরণ করে তবে নেভিগেশন আচরণ সহ।
SwiftUI Lab (2024) অনুসারে, NavigationLink SwiftUI অ্যাপ্লিকেশনগুলিতে সবচেয়ে বেশি ব্যবহৃত Views-এর মধ্যে একটি, শুধুমাত্র Text, Image এবং VStack-এর পরে। ইনিশিয়ালাইজেশন ফর্মগুলির মধ্যে পার্থক্য বোঝা কর্মক্ষমতা এবং পূর্বানুমানযোগ্য নেভিগেশন আচরণের জন্য গুরুত্বপূর্ণ।
চাপলে, NavigationLink নিকটতম NavigationStack বা NavigationView-এর সাথে সম্পর্কিত নেভিগেশন স্ট্যাকে একটি মান (বা destination) যোগ করে। SwiftUI View পিরামিডের মাধ্যমে নেভিগেশন পাথ পাস করতে EnvironmentValue ব্যবহার করে। NavigationLink Environment থেকে এই পাথ পড়ে এবং চাপলে এটি পরিবর্তন করে।
NavigationLink-এর দুটি প্রধান ফর্ম রয়েছে: destination সহ (সরাসরি লক্ষ্য View নির্দিষ্ট করা) এবং value সহ (NavigationDestination-এর জন্য মান)। ফর্মের পছন্দ iOS সংস্করণ এবং নেভিগেশন আর্কিটেকচারের উপর নির্ভর করে।
| ফর্ম | ইনিশিয়ালাইজার | iOS 13–15 | iOS 16+ |
|---|---|---|---|
| Destination | NavigationLink(destination:label:) | সুপারিশকৃত | সুপারিশকৃত নয় |
| Value | NavigationLink(value:label:) | উপলব্ধ নয় | সুপারিশকৃত |
| IsActive | NavigationLink(isActive:destination:label:) | প্রোগ্রামেটিক নেভিগেশন | সুপারিশকৃত নয় |
Destination ফর্ম (iOS 13+): NavigationLink(destination: DetailView(), label: { Text("Open") })। এই ফর্ম NavigationLink রেন্ডার করার সময় অবিলম্বে DetailView তৈরি করে, এমনকি ব্যবহারকারী লিঙ্কে ক্লিক না করলেও। এটি View-এর অকাল ইনিশিয়ালাইজেশন এবং সম্ভাব্য কর্মক্ষমতা সমস্যার দিকে নিয়ে যায় যদি লক্ষ্য View তার ইনিশিয়ালাইজারে ভারী অপারেশন করে।
Value ফর্ম (iOS 16+): NavigationLink(value: "detail_42", label: { Text("Open") })। লক্ষ্য View শুধুমাত্র লিঙ্ক চাপলে তৈরি করা হয়, যখন SwiftUI সংশ্লিষ্ট .navigationDestination খুঁজে পায়। এটি অকাল ইনিশিয়ালাইজেশন প্রতিরোধ করে এবং নেভিগেশনকে আরও পূর্বানুমানযোগ্য করে তোলে।
NavigationStack-এর সাথে NavigationLink iOS 16+-এ value ফর্মে স্যুইচ করা প্রয়োজন। আপনি নেভিগেশনের জন্য একটি ডেটা টাইপ (String, Int, enum Route) নির্ধারণ করেন এবং .navigationDestination-এর মাধ্যমে গন্তব্য নিবন্ধন করেন। NavigationLink শুধুমাত্র স্ট্যাকে মান রাখে, এবং SwiftUI চাপলে লক্ষ্য View তৈরি করে।
struct CatalogView: View {
let categories: [String]
var body: some View {
List(categories, id: \.self) { category in
NavigationLink(value: category) {
Text(category)
}
}
.navigationDestination(for: String.self) { category in
CategoryView(name: category)
}
}
}
// Programmatic navigation:
struct DeepLinkView: View {
@State private var path: [AppRoute] = []
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: AppRoute.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
case .settings: SettingsView()
}
}
.toolbar {
Button("Open Settings") {
path.append(AppRoute.settings)
}
}
}
}
}
প্রোগ্রামেটিক নেভিগেশন: পাথে একটি মান যোগ করা (path.append-এর মাধ্যমে) একই মান সহ NavigationLink চাপার সমতুল্য। এটি ViewModel, Coordinator বা পুশ নোটিফিকেশনের প্রতিক্রিয়ায় নেভিগেশন বাস্তবায়নের অনুমতি দেয়।
IsActive ফর্ম (NavigationLink(isActive:destination:label:)) সামঞ্জস্যের জন্য উপলব্ধ কিন্তু iOS 16+-এ সুপারিশকৃত নয়। পাথ অ্যারে বা NavigationPath-এ Binding সহ value ফর্ম ব্যবহার করুন।
List-এ NavigationLink স্বয়ংক্রিয়ভাবে সারির ডান পাশে একটি প্রকাশক নির্দেশক (chevron) প্রদর্শন করে, ব্যবহারকারীকে সংকেত দেয় যে চাপলে অন্য স্ক্রিনে যাওয়া হবে। List তীর প্রদর্শন স্বয়ংক্রিয়ভাবে পরিচালনা করে — একটি সাধারণ NavigationLink-এর বিপরীতে যা তালিকার বাইরে থাকে, যেখানে কোনো তীর নেই।
iOS 16-এর সাথে, NavigationLink সহ List স্বয়ংক্রিয়ভাবে List(data:rowContent:)-এর ভিতরে value ফর্ম ব্যবহার করে। List-এর ভিতরে ForEach ব্যবহার করার সময়, প্রকাশক নির্দেশকও স্বয়ংক্রিয়ভাবে যোগ করা হয়। এই আচরণ পরিবর্তনকারীদের মাধ্যমে নিষ্ক্রিয় করা যায় না — শুধুমাত্র NavigationLink-কে Button দিয়ে প্রতিস্থাপন করলে তীর সরাতে পারে।
List-এ destination ফর্মের সমস্যা: যদি আপনি List-এর ভিতরে NavigationLink(destination:label:) ব্যবহার করেন, তাহলে সমস্ত গন্তব্য Views তালিকা লোড করার সময় অবিলম্বে তৈরি করা হয়, ব্যবহারকারী লিঙ্কে ক্লিক করেছে কিনা তা নির্বিশেষে। বিপুল সংখ্যক সারি সহ তালিকার জন্য, এটি প্রাথমিক লোডিং উল্লেখযোগ্যভাবে ধীর করতে পারে এবং মেমরি খরচ বাড়াতে পারে। NavigationStack-এর সাথে value ফর্ম এই সমস্যার সমাধান করে।
WWDC 2022 (Session 10054) অনুসারে, Apple নতুন প্রকল্পের জন্য NavigationStack এবং NavigationLink-এর value ফর্ম ব্যবহার করার পরামর্শ দেয়। এটি বিশেষ করে গতিশীল ডেটা সহ List-এর জন্য গুরুত্বপূর্ণ, যেখানে সারির সংখ্যা বড় হতে পারে।
প্যাটার্ন 1: কাস্টম NavigationLink চেহারা। NavigationLink যেকোনো View কে label হিসাবে গ্রহণ করে, যা লিঙ্কের জন্য কাস্টম ডিজাইন তৈরি করার অনুমতি দেয়। List-এর ভিতরে, এটি বিশেষভাবে সুবিধাজনক — আপনি NavigationLink ব্যবহার করার সময় স্বয়ংক্রিয় প্রকাশক নির্দেশক পান।
NavigationLink(value: ProductRoute.detail(product)) {
HStack {
AsyncImage(url: product.imageURL)
.frame(width: 60, height: 60)
VStack(alignment: .leading) {
Text(product.name).font(.headline)
Text(product.price) .foregroundColor(.secondary)
}
}
.padding(8)
}
প্যাটার্ন 2: তীর ছাড়া NavigationLink (কাস্টম বাটন)। যদি আপনার প্রকাশক নির্দেশকের প্রয়োজন না হয়, তাহলে প্রোগ্রামেটিক নেভিগেশনের জন্য Button ব্যবহার করুন: path.append(value)। এটি কাস্টম ইন্টারফেস উপাদানের জন্য দরকারী যেখানে NavigationLink অপ্রাকৃতিক দেখায়।
প্যাটার্ন 3: শর্তসাপেক্ষ নেভিগেশন। আপনি খালি destination ব্যবহার করে বা নির্দিষ্ট মানের জন্য .navigationDestination না যোগ করে NavigationLink ব্লক করতে পারেন। পাথের মাধ্যমে প্রোগ্রামেটিক নেভিগেশন মান যোগ করার আগে শর্ত পরীক্ষা করার অনুমতি দেয়।
Hacking with Swift (2024) অনুসারে, NavigationLink-এর বেশিরভাগ সমস্যা পুরানো প্রকল্পে destination ফর্ম ব্যবহারের সাথে সম্পর্কিত। NavigationStack-এ মাইগ্রেট করার সময়, সমস্ত NavigationLink(destination:label:)কে NavigationLink(value:label:) দিয়ে প্রতিস্থাপন করুন এবং রুট স্তরে .navigationDestination যোগ করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
NavigationLink SwiftUI-তে অন্য স্ক্রিনে ট্রানজিশনের জন্য একটি View। চাপলে, এটি লক্ষ্য স্ক্রিনকে NavigationStack বা NavigationView নেভিগেশন স্ট্যাকে স্থাপন করে। এটি দুটি ফর্ম সমর্থন করে: destination (লক্ষ্য View) এবং value (রাউটিং মান) সহ।
Value ফর্ম (iOS 16+) পছন্দনীয়: লক্ষ্য View শুধুমাত্র চাপলে তৈরি হয়, লিঙ্ক রেন্ডার করার সময় নয়। Destination ফর্ম অবিলম্বে View তৈরি করে, যা কর্মক্ষমতা সমস্যা সৃষ্টি করতে পারে। iOS 16+ প্রকল্পের জন্য, value + NavigationDestination ব্যবহার করুন।
SwiftUI স্বয়ংক্রিয়ভাবে List-এর ভিতরে NavigationLink-এ একটি প্রকাশক নির্দেশক (তীর) যোগ করে, নেভিগেশনের সম্ভাবনার সংকেত দেয়। এই আচরণ নিষ্ক্রিয় করা যায় না। যদি তীরের প্রয়োজন না হয়, তাহলে path.append()-এর মাধ্যমে প্রোগ্রামেটিক নেভিগেশন সহ Button ব্যবহার করুন।
Binding পাথ সহ NavigationStack ব্যবহার করুন এবং path.append(value)-এর মাধ্যমে মান যোগ করুন। এটি একই value সহ NavigationLink চাপার সমতুল্য। প্রোগ্রামেটিক নেভিগেশন ডিপলিঙ্ক, পুশ নোটিফিকেশন এবং Coordinator প্যাটার্ন বাস্তবায়নের অনুমতি দেয়।
Destination ফর্ম কর্মক্ষমতা প্রভাবিত করতে পারে যদি লক্ষ্য Views তাদের ইনিশিয়ালাইজারে ভারী অপারেশন করে — তালিকা রেন্ডার করার সময় সমস্ত গন্তব্য তৈরি করা হয়। NavigationStack-এর সাথে value ফর্ম শুধুমাত্র চাপলে Views তৈরি করে এই সমস্যার সমাধান করে। 50+ সারি সহ তালিকার জন্য, পার্থক্যটি উল্লেখযোগ্য।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন