iOS / Swift / قيم Swift وملكية SwiftUI / الدرس 6
قيم التنقل وتقديم الواجهات
نمذج الوجهات بقيَم مستقرة وافصل التحقق من المسار عن الصلاحية وعرّف الإلغاء صراحة.
في هذه الصفحة
أهداف الدرس
- يغير التنقل ملكية التفاعل
- استخدم مسارا محدد النوع للوجهات الصريحة
- أبق صلاحية الإغلاق في موضع البيئة الصحيح
يغير التنقل ملكية التفاعل
يفتح التنقل سياق تفاعل جديدا له مدخل وعمر. فضّل تمرير معرّف سجل مستقر أو قيمة صغيرة ثابتة بدلا من شاشة أب متغيرة كاملة. يستطيع مالك البيانات حل المحتوى الحالي وعرض الغياب بوضوح. الرابط المرئي ليس فحص تفويض. فقد يصل الرابط العميق إلى الوجهة دون القائمة المعتادة، لذا يجب معالجة المدخل المعيب وغياب الصلاحية عند الحدود المعتمدة. افصل حالة العرض المحلية عن حالة المجال المشتركة.
استخدم مسارا محدد النوع للوجهات الصريحة
يمكن لـ NavigationStack ربط مكدسه بقيَم تصف الوجهات. يستخدم المقتطف الأول معرّفات نصية مستقرة ويحدد عرض وجهة String. وفي تطبيق أكبر يمنع تعداد مسار Hashable مخصص خلط النصوص غير المرتبطة بفئة واحدة. يسجل المسار حالة التنقل لا مخزنا لكل نموذج متغير. حدّد الرجوع والتصفير البرمجي واستعادة المسار قبل نشر أوامر إغلاق عشوائية في الشجرة. تحتاج NavigationStack إلى خط نظام مدعوم، وتختلف عن واجهات التنقل الأقدم.
struct WorkshopNavigation: View {
@State private var path: [String] = []
var body: some View {
NavigationStack(path: $path) {
NavigationLink("Open Maps", value: "w-7")
.navigationDestination(for: String.self) { id in
Text("Workshop \(id)")
}
.navigationTitle("Workshops")
}
}
}
Activating Open Maps pushes a destination showing Workshop w-7.
يتطلب SwiftUI وiOS 16 أو أحدث لـ NavigationStack. خط الدورة iOS 17 أو أحدث؛ ولم يُنفذ تنقل هنا.
أبق صلاحية الإغلاق في موضع البيئة الصحيح
يقرأ المقتطف الثاني dismiss من بيئة الورقة المقدمة. تنتمي القيمة إلى سياق التقديم، لذا ينبغي قراءتها داخل المحتوى المقدم لا افتراض أن dismiss الأب يغلق الورقة التي سينشئها. ينهي الإغلاق التفاعل ولا يحفظ النموذج أو يتراجع عنه تلقائيا. يحتاج المحرر القابل للإلغاء إلى سياسة مسودة مستقلة عن آلية الورقة. حدّد هل يسمح بالإغلاق التفاعلي مع عمل غير محفوظ وقدّم اختيار تعاف واضحا.
struct WorkshopSheet: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
VStack {
Text("Workshop information")
Button("Done") { dismiss() }
}
}
}
// A parent presents WorkshopSheet with its sheet modifier.
Done requests dismissal of the sheet containing WorkshopSheet.
حُذفت بيئة التقديم. يختلف أثر dismiss خارج تقديم فعّال مناسب، وليست العملية حفظا.
حلّل المسارات الخارجية قبل جلب البيانات
ينبغي لمعالج الرابط العميق فحص المخطط والمضيف وشكل المسار والوسائط اللازمة بحسب العقد. يثبت التحليل إمكان وصف وجهة مدعومة فقط. قد يظل السجل مفقودا أو غير متاح، وقد يحتاج التطبيق إلى توثيق قبل حله. تجنب تعويض فشل التحليل بسجل افتراضي اعتباطي، فيبدو الرابط المعيب ناجحا. أبق الروابط غير المدعومة في تدفق خطأ أو بديل واضح. ولا تضع أسرارا أو محتوى حساسا في العناوين لمجرد أن التنقل يحمل نصوصا.
ميّز استعادة التنقل من استعادة البيانات
قد تساعد استعادة المسار على العودة إلى وجهة سابقة، لكن يجب حل كل معرّف محفوظ ضمن الحساب والإصدار الحاليين. قد يشير مسار قديم إلى بيانات محذوفة أو سجل جلسة انتهت. أضف إصدارا لصيغة الاستعادة عند الحاجة ولا تحفظ كائنات عرض عابرة أو إغلاقات. أبق المسار المحفوظ صغيرا وصريحا. وإذا تعذرت استعادة الوجهة بأمان فارجع إلى موضع مفهوم مع شرح بدلا من فرض حالة قديمة على نطاق ملكية جديد.
اختبر كل طرق المغادرة
اختبر الفتح والرجوع وDone في الورقة والإغلاق التفاعلي والإلغاء مع مسودة والدخول الخارجي المباشر والبيانات الغائبة والخروج أثناء فتح الوجهة. تحقق من انتقال التركيز وسياق الإتاحة بصورة مفهومة. لا يثبت محلّل مسار نقي إعداد الروابط الشاملة أو تسليم النظام أو تنقل الجهاز. تحتاج هذه إلى فحوص هدف مصرح بها بإعداد التطبيق المختار. افصل نتائج التقديم المتوقعة في الدورة من دليل محاكي أو جهاز حقيقي، إذ لم تُنفذ أدوات Apple أثناء التأليف.
الأخطاء الشائعة وإصلاحها
يستهدف dismiss تقديما خاطئا
- لماذا يحدث؟
- قُرئ إجراء البيئة من سياق الأب.
- كيف تصلحه؟
- اقرأ dismiss داخل المحتوى المقدم المالك للتفاعل.
- كيف تتجنب تكراره؟
- اختبر التقديمات المتداخلة وإجراءات إغلاقها.
يفتح رابط عميق سجلا مقنعا لكنه خاطئ
- لماذا يحدث؟
- اختار المدخل المعيب معرّفا افتراضيا بصمت.
- كيف تصلحه؟
- ارفض الأشكال غير المدعومة واعرض بديلا مفهوما.
- كيف تتجنب تكراره؟
- أدرج الروابط المعيبة وناقصة الوسائط في الاختبارات.
تكشف استعادة المسار بيانات حساب قديم
- لماذا يحدث؟
- استعيدت المعرّفات دون فحص الملكية الحالية.
- كيف تصلحه؟
- حل ضمن الجلسة الحالية وافرض الصلاحية المعتمدة.
- كيف تتجنب تكراره؟
- اختبر الاستعادة بعد الخروج وتبديل الحساب.
اختبر فهمك
1. لماذا يحمل المسار w-7 بدلا من الموضع السابع في المصفوفة؟
اعرض الحل المشروح
يتغير الموضع بالترشيح والفرز والتحديث. يظل المعرّف المستقر يسمّي السجل المقصود ليحله المالك أو يعلن غيابه. يبقى المسار بذلك مفهوما بعيدا عن لقطة القائمة الأصلية.
2. هل يلغي إغلاق الورقة تلقائيا تعديلات روابط مشتركة؟
اعرض الحل المشروح
لا. قد تكون الروابط غيّرت المصدر بالفعل. استخدم مسودة مستقلة واعتمدها بالحفظ فقط للمحرر القابل للإلغاء. يتحكم الإغلاق في عمر التقديم، بينما الإلغاء والحفظ قراران مستقلان يحتاجان إلى اختبارات صريحة.
أهم ما تعلمته
- يغير التنقل ملكية التفاعل
- اختبر كل طرق المغادرة