NavigationView هو مكون حاوية في SwiftUI لتنظيم التنقل المكدس بين الشاشات. ينشئ NavigationView مكدس تنقل مع شريط تنقل تلقائي وعنوان وزر «رجوع». منذ iOS 16، توصي Apple باستخدام NavigationStack. اقرأ المزيد في وثائق Apple.
النقاط الرئيسية
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، تتكيف مع المنصة.
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 iPad | ColumnStyle / StackStyle | NavigationSplitView (iOS 16+) |
للمشاريع ذات الإصدار الأدنى iOS 16+، استخدم NavigationStack. لدعم iOS 14-15 — NavigationView. ليس لـ NavigationStack نظائر مباشرة للإصدارات القديمة، لذا يتطلب الترقية التحقق من التوافق.
يتحكم المعدِّلان .toolbar و .navigationTitle في محتوى شريط التنقل. يحدد .navigationTitle عنوان الشاشة، ويختار .navigationBarTitleDisplayMode النمط: .large (كبير، افتراضي) أو .inline (مضغوط، كما في الإعدادات). يضيف .toolbar أزراراً وبحثاً وتحكماً مقسماً.
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 هو نوع من iOS 16+ يمثل مكدس تنقل كمجموعة من قيم Hashable. يضيف المطور عناصر إلى path للانتقال البرمجي ويزيلها للعودة. يدعم NavigationPath الروابط العميقة وإشعارات الدفع واستعادة الحالة.
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، يظهر الشريط الجانبي والتفاصيل في وقت واحد في وضع التقسيم.
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 هو API قديم (iOS 13-15)، يدعم فقط NavigationLink التصريحي. NavigationStack هو API جديد (iOS 16+)، يضيف path للتنقل البرمجي والروابط العميقة ومكدس مقيد بنمط صارم. توصي Apple باستخدام NavigationStack للمشاريع الجديدة.
عبر المعدِّل .toolbar مع ToolbarItem. مثال: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('الإعدادات') { } } }. يحدد Placement الموضع: trailing (يمين)، leading (يسار)، principal (مركز).
يُضبط العنوان عبر .navigationTitle('العنوان'). النمط — .navigationBarTitleDisplayMode(.large) أو .inline. Large — عنوان كبير على نمط iOS Music، inline — مضغوط، كما في الإعدادات. يمكن تغيير النمط لكل شاشة على حدة.
ثلاث طرق: عبر value (NavigationLink(value:item) { Label }، iOS 16+)، عبر destination + label، عبر isActive للانتقال البرمجي. NavigationLink مع value أنظف للقوائم لأنه لا يتطلب إنشاء View الهدف قبل الانتقال.
نعم. NavigationView و NavigationStack متاحان على iOS و iPadOS و watchOS و tvOS و macOS. على watchOS يستخدم التنقل تسلسل الواجهة مع Digital Crown، على tvOS — إدخال قائم على التركيز مع جهاز التحكم. يتكيف السلوك مع المنصة تلقائياً.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.