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"))
महत्वपूर्ण नियम: .navigationDashboard को उस 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें