NavigationStack SwiftUI میں ایک جدید نیویگیشن کنٹینر ہے، جو iOS 16+ میں متعارف کرایا گیا اور اس نے NavigationView کو تبدیل کر دیا۔ Apple Developer Documentation, 2024 کے مطابق، NavigationStack ایک ٹائپ سیف نیویگیشن پاتھ (NavigationPath) کے ذریعے اسکرینوں کے اسٹیک کا انتظام کرتا ہے، گہری نیویگیشن، روٹ اسکرین پر پروگراماتی واپسی اور ڈیٹا تبدیل ہونے پر حالت کے تحفظ کو سپورٹ کرتا ہے۔ NavigationView کے برعکس، NavigationStack کو اضافی کنٹینر میں لپیٹنے کی ضرورت نہیں ہوتی اور یہ نیویگیشن پاتھ کو براہ راست Binding فراہم کرتا ہے۔
اہم نکات
NavigationStack ایک کنٹینر View ہے جو اسٹیک پر مبنی نیویگیشن (LIFO) کو نافذ کرتا ہے۔ یہ منتقلی کی تاریخ کا انتظام کرتا ہے، جس سے آپ اسٹیک پر نئی اسکرینیں ڈال سکتے ہیں اور سسٹم کے “واپس” بٹن یا پروگراماتی طور پر واپس جا سکتے ہیں۔ NavigationStack iOS 16، iPadOS 16، macOS 13، watchOS 9 اور tvOS 16 سے SwiftUI کا حصہ ہے۔
NavigationStack کی بنیادی اختراع ٹائپ سیف نیویگیشن پاتھ ہے۔ NavigationLink بناتے وقت براہ راست منزل بتانے کے بجائے، آپ پاتھ میں ایک قدر ڈالتے ہیں اور منزل View کو .navigationDestination(for:destination:) موڈیفائر کے ذریعے علیحدہ سے رجسٹر کیا جاتا ہے۔ یہ نیویگیشن کو رینڈرنگ سے الگ کرتا ہے، کوڈ کو زیادہ ماڈیولر اور ٹیسٹ ایبل بناتا ہے۔
WWDC 2022 (سیشن 10054) کے مطابق، NavigationStack ObservableObject اور SwiftUI لائف سائیکل پر مبنی ایک نیا نیویگیشن میکانزم استعمال کرتا ہے۔ NavigationView کے برعکس، جو اندرونی طور پر UINavigationController پر انحصار کرتا تھا، NavigationStack مکمل طور پر SwiftUI میں نافذ کیا گیا ہے، جو SwiftUI لائف سائیکل کے ساتھ پیش گوئی اور مطابقت کو بہتر بناتا ہے۔
NavigationStack ایک روٹ View اور ایک اختیاری نیویگیشن پاتھ (NavigationPath یا Hashable اقدار کی صف کے لیے Binding) قبول کرتا ہے۔ تمام چائلڈ اسکرینیں NavigationLink کے ذریعے یا پاتھ میں پروگراماتی طور پر اقدار شامل کرکے اسٹیک پر ڈالی جاتی ہیں۔
NavigationView iOS 16 سے پہلے SwiftUI میں مرکزی نیویگیشن کنٹینر تھا۔ یہ اندرونی طور پر خود بخود UINavigationController کا انتظام کرتا تھا، جس سے کئی مسائل پیدا ہوتے تھے: ڈیٹا تبدیل ہونے پر غیر متوقع رویہ، پروگراماتی نیویگیشن میں پیچیدگی اور ٹائپ سیفٹی کی کمی۔
| خصوصیت | NavigationStack (iOS 16+) | NavigationView (iOS 13–15) |
|---|---|---|
| نیویگیشن کی قسم | اسٹیک (LIFO) | اسٹیک (LIFO) |
| نیویگیشن پاتھ | ٹائپ کیا ہوا (NavigationPath) | تعاون یافتہ نہیں |
| Deep linking | بلٹ ان سپورٹ | حل درکار ہے |
| پروگراماتی واپسی | پاتھ کے ذریعے (pop, popToRoot) | dismiss, presentationMode |
| اندرونی طور پر | SwiftUI مقامی | UINavigationController |
| مطابقت | iOS 16+ | iOS 13+ |
بنیادی فائدہ NavigationStack کا — ٹائپ سیف نیویگیشن۔ آپ پاتھ کو مخصوص اقسام کی صف (یا مختلف اسٹیک کے لیے NavigationPath) کے طور پر بیان کرتے ہیں اور ہر قسم کے لیے ایک منزل رجسٹر کرتے ہیں۔ یہ قسم کی عدم مطابقت کی غلطیوں کو ختم کرتا ہے اور نیویگیشن کو پیش گوئی کے قابل بناتا ہے۔
NavigationView iOS 17 میں فرسودہ ہو گیا ہے۔ Apple تمام نئے پروجیکٹس کے لیے اور کم از کم ورژن iOS 16 میں اپ ڈیٹ کرتے وقت NavigationStack میں منتقلی کی تجویز کرتا ہے۔
NavigationPath ایک قسم ہے جو NavigationStack میں نیویگیشن پاتھ کی نمائندگی کرتی ہے۔ یہ مختلف اقسام کی اقدار (AnyHashable) ذخیرہ کر سکتا ہے یا صف [T: Hashable] کے لیے Binding کے ذریعے ایک مخصوص قسم کے ساتھ استعمال کیا جا سکتا ہے۔ NavigationPath حالت کے تحفظ کے لیے خود بخود انکوڈ اور ڈی کوڈ ہوتا ہے۔
struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: String.self) { value in
DetailView(id: value)
}
.navigationDestination(for: Int.self) { value in
NumberView(number: value)
}
}
}
func goToRoot() {
path.removeLast(path.count)
}
func pushDeepLink() {
path.append("detail_42")
}
}
مختلف اسٹیک: NavigationPath میں مختلف اقسام کی اقدار ہو سکتی ہیں اگر وہ Hashable کو لاگو کریں۔ مثال کے طور پر، پہلی اسکرین ایک String (ID) قبول کر سکتی ہے، دوسری ایک Int (نمبر)، تیسری ایک کسٹم enum Route۔ ہر قسم ڈسپلے کے لیے ایک علیحدہ .navigationDestination رجسٹر کرتی ہے۔
Codable سپورٹ: NavigationPath Codable کو لاگو کرتا ہے اگر پاتھ میں تمام اقدار بھی Codable + Hashable ہوں۔ یہ ایپ کو دوبارہ شروع کرنے یا بیک گراؤنڈ میں جانے پر نیویگیشن کی حالت کو محفوظ اور بحال کرنے کی اجازت دیتا ہے۔
.navigationDestination(for:destination:) — ایک موڈیفائر جو ایک مخصوص ڈیٹا ٹائپ کے لیے منزل View رجسٹر کرتا ہے۔ جب NavigationLink اس قسم کی ایک قدر پاتھ میں ڈالتا ہے، SwiftUI خود بخود متعلقہ .navigationDestination ڈھونڈتا ہے اور اسکرین بناتا ہے۔
enum AppRoute: Hashable {
case profile(UserID)
case settings
case about
}
struct AppNavigation: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: AppRoute.self) { route in
switch route {
case .profile(let id):
ProfileView(userId: id)
case .settings:
SettingsView()
case .about:
AboutView()
}
}
}
}
}
// Navigate: path.append(AppRoute.profile("user_123"))
اہم اصول: .navigationDestination کو اس View پر لاگو کیا جانا چاہیے جو NavigationStack کے اندر ہو، اور NavigationLink کے پاتھ میں قدر ڈالنے سے پہلے۔ اسے عام طور پر روٹ View یا سیکشن کنٹینر میں شامل کیا جاتا ہے۔ اگر قدر کی قسم کے لیے .navigationDestination نہ ملے تو منتقلی نہیں ہوگی۔
SwiftUI Engineering (2023) کے مطابق، .navigationDestination درجہ بندی کی مختلف سطحوں پر رجسٹر کیا جا سکتا ہے۔ SwiftUI نیویگیشن کے دوران قریب ترین مماثل منزل تلاش کرتا ہے۔ یہ ایپلیکیشن کے مختلف حصوں میں ایک قسم کے لیے منزل کو اوور رائڈ کرنے کی اجازت دیتا ہے۔
پیٹرن 1: enum Route کے ذریعے نیویگیشن۔ ایپلیکیشن کی تمام اسکرینوں کے لیے منسلک اقدار کے ساتھ ایک enum بیان کریں۔ روٹنگ کے لیے AppRoute کے لیے ایک .navigationDestination اور ایک switch استعمال کریں۔ یہ ایپلیکیشن میں تمام ممکنہ منتقلیوں کے لیے ایک واحد سچائی کا ذریعہ فراہم کرتا ہے۔
struct StoreView: View {
@State private var path: [ProductRoute] = []
var body: some View {
NavigationStack(path: $path) {
ProductGrid()
.navigationDestination(for: ProductRoute.self) { route in
switch route {
case .detail(let product):
ProductDetail(product: product)
case .reviews(let productId):
ReviewsView(productId: productId)
}
}
}
}
}
enum ProductRoute: Hashable {
case detail(Product)
case reviews(String)
}
پیٹرن 2: پروگراماتی نیویگیشن اور deep linking۔ NavigationStack پروگراماتی اسٹیک مینجمنٹ کی اجازت دیتا ہے: اسکرینیں شامل کرنا، ہٹانا اور روٹ پر واپس آنا۔ یہ پش نوٹیفیکیشن، ڈیپ لنکس اور دوبارہ شروع کرنے کے بعد نیویگیشن بحال کرنے کے لیے ضروری ہے۔
پیٹرن 3: NavigationPath کے بجائے اقسام کی صف۔ اگر تمام اسکرینیں ایک ہی قسم استعمال کرتی ہیں (مثال کے طور پر، String یا ایک کسٹم enum)، تو [T] کے لیے Binding استعمال کریں۔ یہ NavigationPath سے زیادہ مضبوط ٹائپنگ اور بہتر کارکردگی فراہم کرتا ہے۔ NavigationPath مختلف اسکرین اقسام والے مختلف اسٹیک کے لیے موزوں ہے۔
Point-Free (2024) کے مطابق، enum Route کے ساتھ NavigationStack SwiftUI ایپلیکیشنز میں نیویگیشن کو منظم کرنے کا ترجیحی طریقہ ہے۔ یہ تمام ممکنہ منتقلیوں کو واضح، ٹائپ سیف اور ٹیسٹ ایبل بناتا ہے، جو درجنوں اسکرینوں والے بڑے پروجیکٹس کے لیے خاص طور پر اہم ہے۔
اکثر پوچھے گئے سوالات
NavigationStack — ایک SwiftUI نیویگیشن کنٹینر (iOS 16+) ہے جو ٹائپ سیف پاتھ کے ذریعے اسکرینوں کے اسٹیک کا انتظام کرتا ہے۔ اس نے NavigationView کو تبدیل کر دیا، جو deep linking، پروگراماتی نیویگیشن اور حالت کے تحفظ کے لیے سپورٹ فراہم کرتا ہے۔
NavigationStack NavigationLink کو براہ راست منزل سے باندھنے کے بجائے ایک ٹائپ سیف پاتھ (NavigationPath) استعمال کرتا ہے۔ یہ پروگراماتی نیویگیشن، deep linking اور حالت کے تحفظ کے لیے Codable کو سپورٹ کرتا ہے۔ یہ UINavigationController کے ذریعے نہیں بلکہ SwiftUI پر کام کرتا ہے۔
NavigationPath ایک قسم ہے جو اسٹیک میں اسکرینوں کی ترتیب کی نمائندگی کرتی ہے۔ آپ path.append() یا قدر کے ساتھ NavigationLink کے ذریعے پاتھ میں اقدار شامل کرتے ہیں۔ ہر قسم ڈسپلے کے لیے .navigationDestination رجسٹر کرتی ہے۔ NavigationPath Codable اور خودکار حالت کے تحفظ کو سپورٹ کرتا ہے۔
پروگراماتی پاتھ مینجمنٹ کے ذریعے: URL پر کارروائی کرنے کے بعد، متعلقہ روٹ قدر کے ساتھ path.append() کو کال کریں۔ NavigationStack خود بخود ہدف اسکرین ڈسپلے کرتا ہے۔ روٹ پر واپسی — path.removeLast(path.count).
ہاں، اگر آپ کا کم از کم ورژن iOS 16+ ہے۔ NavigationView iOS 17 میں فرسودہ ہو گیا ہے۔ منتقلی ٹائپ سیف نیویگیشن، deep linking سپورٹ اور SwiftUI لائف سائیکل کے ساتھ بہتر ہم آہنگی فراہم کرتی ہے۔ iOS 15 اور اس سے نیچے کے پروجیکٹس کے لیے، فی الحال NavigationView استعمال جاری رکھیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں