NavigationView: الأساسيات، مكدس التنقل في تطبيقات SwiftUI

المؤلف: IT Sectr نُشر: 2026-02-22 وقت القراءة: 6 دق

NavigationView هو مكون حاوية في SwiftUI لتنظيم التنقل المكدس بين الشاشات. ينشئ NavigationView مكدس تنقل مع شريط تنقل تلقائي وعنوان وزر «رجوع». منذ iOS 16، توصي Apple باستخدام NavigationStack. اقرأ المزيد في وثائق Apple.

النقاط الرئيسية

  • NavigationView — حاوية SwiftUI للتنقل المكدس، تنشئ شريط تنقل وزر رجوع
  • NavigationLink — عنصر الانتقال إلى شاشة جديدة داخل NavigationView
  • NavigationStack — خليفة NavigationView (iOS 16+) مع إدارة برمجية للمكدس
  • .toolbar — معدِّل لإضافة أزرار إلى شريط التنقل
  • .navigationTitle — يحدد عنوان الشاشة بنمط كبير أو مضمن

ما هو NavigationView؟

NavigationView هو حاوية SwiftUI تغلف تسلسلاً هرمياً من الشاشات وتوفر واجهة تنقل. داخل NavigationView يعمل NavigationLink — عنصر عند الضغط عليه يستبدل الشاشة الحالية بأخرى جديدة. يضيف NavigationView تلقائياً شريط تنقل مع عنوان وزر «رجوع».

ظهر NavigationView في iOS 13 مع SwiftUI. من الناحية المفاهيمية، يحل محل UINavigationController من UIKit لكنه مطبَّق بشكل تصريحي. بدلاً من الدفع/الإرجاع اليدوي، يصف المطور العلاقة بين الشاشات باستخدام NavigationLink. يدير النظام المكدس تلقائياً.

NavigationView يدعم المعدِّلات .navigationTitle و .navigationBarTitleDisplayMode و .toolbar و .searchable. بالنسبة لـ iOS 16+، قدمت Apple NavigationStack الذي يحافظ على API NavigationView لكنه يضيف إدارة برمجية للمكدس عبر NavigationPath. للمشاريع التي تدعم iOS 15 وما دونه، يبقى NavigationView الخيار الوحيد.

NavigationLink هو عنصر SwiftUI ينشئ انتقالاً إلى شاشة مستهدفة داخل NavigationView أو NavigationStack. عند الضغط على NavigationLink، يضيف النظام الشاشة المستهدفة إلى مكدس التنقل. حركة الانتقال هي الدفع القياسي من اليمين في iOS، تتكيف مع المنصة.

swift
struct ContentView: View {
    var body: some View {
        NavigationView {
            List(items) { item in
                NavigationLink(destination: DetailView(item: item)) {
                    Text(item.title)
                }
            }
            .navigationTitle("قائمة")
        }
    }
}

struct DetailView: View {
    let item: Item

    var body: some View {
        VStack {
            Text(item.description)
                .navigationTitle(item.title)
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}

يقبل NavigationLink معلمتين: destination — View الهدف، و label — العنصر الذي يضغط عليه المستخدم. للقوائم، هناك بناء جملة مناسب مع value و NavigationLink(value:) الذي يلغي تحديد الخلية تلقائياً ويعمل مع NavigationPath.

مع iOS 16، قدمت Apple NavigationStack كبديل لـ NavigationView. يحافظ NavigationStack على بناء الجملة التصريحي لكنه يضيف ميزة بالغة الأهمية — الإدارة البرمجية للمكدس عبر الخاصية path من نوع NavigationPath أو مصفوفة من Hashable.

الميزةNavigationView (iOS 13-15)NavigationStack (iOS 16+)
دفع برمجيلا، فقط عبر NavigationLinkنعم، عبر path.append(value)
popToRootفقط إغلاق حتى الجذرpath.removeLast(path.count)
الروابط العميقةتنفيذ معقددعم مدمج عبر path
كتابة المكدسلا (أي View في destination)نعم (مصفوفة من قيم Hashable)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

للمشاريع ذات الإصدار الأدنى iOS 16+، استخدم NavigationStack. لدعم iOS 14-15 — NavigationView. ليس لـ NavigationStack نظائر مباشرة للإصدارات القديمة، لذا يتطلب الترقية التحقق من التوافق.

Toolbar وإعداد navigationTitle

يتحكم المعدِّلان .toolbar و .navigationTitle في محتوى شريط التنقل. يحدد .navigationTitle عنوان الشاشة، ويختار .navigationBarTitleDisplayMode النمط: .large (كبير، افتراضي) أو .inline (مضغوط، كما في الإعدادات). يضيف .toolbar أزراراً وبحثاً وتحكماً مقسماً.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("الملف الشخصي") {
                    Text("اسم المستخدم")
                    Toggle("الإشعارات", isOn: $notifications)
                }
            }
            .navigationTitle("الإعدادات")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("حفظ") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable هو معدِّل آخر يدمج شريط بحث في شريط التنقل. يعمل مع كل من NavigationView و NavigationStack. يختفي البحث تلقائياً عند التمرير ويظهر عند السحب لأسفل. يدعم تصفية القوائم عبر Binding String.

التنقل البرمجي مع NavigationPath

NavigationPath هو نوع من iOS 16+ يمثل مكدس تنقل كمجموعة من قيم Hashable. يضيف المطور عناصر إلى path للانتقال البرمجي ويزيلها للعودة. يدعم NavigationPath الروابط العميقة وإشعارات الدفع واستعادة الحالة.

swift
struct AppNavigation: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            List(categories) { category in
                NavigationLink("الفئة \(category.name)",
                               value: category)
            }
            .navigationTitle("الفئات")
            .navigationDestination(for: Category.self) { category in
                ProductListView(category: category)
            }
            .navigationDestination(for: Product.self) { product in
                ProductDetailView(product: product)
            }
        }

        // تنقل برمجي عبر الرابط العميق
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) يسجل نوع بيانات لعرض شاشة له. عندما تُضاف قيمة من هذا النوع إلى path، ينشئ النظام تلقائياً View الهدف. هذا النهج يحل محل NavigationLink(destination:) الصريح ويجعل التنقل مقيداً بنمط صارم.

NavigationView و NavigationStack يعملان على جميع منصات Apple: iOS و iPadOS و watchOS و tvOS و macOS. يتكيف السلوك مع الشاشة. على iPad، يدعم NavigationStack NavigationSplitView الذي يحل محل UISplitViewController من UIKit ويعرض عمودين على الشاشة العريضة.

يقسم NavigationSplitView (iOS 16+) الشاشة إلى شريط جانبي (قائمة) وتفاصيل. على iPhone، يُخفى الشريط الجانبي ويظهر فقط التفاصيل عبر NavigationLink. على iPad، يظهر الشريط الجانبي والتفاصيل في وقت واحد في وضع التقسيم.

swift
struct AdaptiveNavigation: View {
    @State private var selectedCategory: Category?

    var body: some View {
        NavigationSplitView {
            List(categories, selection: $selectedCategory) { category in
                Text(category.name)
            }
            .navigationTitle("الفئات")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

يختار NavigationSplitView تلقائياً وضع العرض الأمثل لكل جهاز. على iPhone في الوضع العمودي — مكدس، على iPad و iPhone في الوضع الأفقي — تقسيم. لا يحتاج المطور إلى كتابة كود منفصل لفئات الحجم المختلفة.

الأسئلة الشائعة

ما الفرق بين NavigationView و NavigationStack؟

NavigationView هو API قديم (iOS 13-15)، يدعم فقط NavigationLink التصريحي. NavigationStack هو API جديد (iOS 16+)، يضيف path للتنقل البرمجي والروابط العميقة ومكدس مقيد بنمط صارم. توصي Apple باستخدام NavigationStack للمشاريع الجديدة.

كيف أضيف زراً إلى navigationBar؟

عبر المعدِّل .toolbar مع ToolbarItem. مثال: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('الإعدادات') { } } }. يحدد Placement الموضع: trailing (يمين)، leading (يسار)، principal (مركز).

كيف أضبط العنوان ونمطه؟

يُضبط العنوان عبر .navigationTitle('العنوان'). النمط — .navigationBarTitleDisplayMode(.large) أو .inline. Large — عنوان كبير على نمط iOS Music، inline — مضغوط، كما في الإعدادات. يمكن تغيير النمط لكل شاشة على حدة.

كيف أنقل البيانات عبر NavigationLink؟

ثلاث طرق: عبر value (NavigationLink(value:item) { Label }، iOS 16+)، عبر destination + label، عبر isActive للانتقال البرمجي. NavigationLink مع value أنظف للقوائم لأنه لا يتطلب إنشاء View الهدف قبل الانتقال.

هل يمكن استخدام NavigationView على watchOS و tvOS؟

نعم. NavigationView و NavigationStack متاحان على iOS و iPadOS و watchOS و tvOS و macOS. على watchOS يستخدم التنقل تسلسل الواجهة مع Digital Crown، على tvOS — إدخال قائم على التركيز مع جهاز التحكم. يتكيف السلوك مع المنصة تلقائياً.

الخلاصة

  • NavigationView — حاوية SwiftUI للتنقل المكدس مع شريط تنقل تلقائي وزر رجوع
  • NavigationLink — عنصر الانتقال الرئيسي، يدعم بناء الجملة التصريحي (destination) والقائم على value
  • NavigationStack (iOS 16+) يحل محل NavigationView، مضيفاً إدارة برمجية للمكدس عبر NavigationPath
  • .toolbar يضيف أزراراً إلى شريط التنقل، .navigationTitle يحدد العنوان مع اختيار نمط large/inline
  • NavigationPath — مكدس مقيد بنمط صارم من قيم Hashable للتنقل البرمجي والروابط العميقة
  • NavigationSplitView (iOS 16+) يكيّف الواجهة لـ iPad و iPhone، ويختار تلقائياً التقسيم أو المكدس
  • يُحدد الاختيار بين NavigationView و NavigationStack حسب أدنى إصدار iOS مدعوم في المشروع

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا