viewWillAppear في iOS: جوهر الطريقة وكيفية استخدامها

المؤلف: IT Sectr نُشر: 2026-03-05 وقت القراءة: 8 دق

viewWillAppear هي طريقة UIViewController يستدعيها UIKit في كل مرة قبل أن تصبح الشاشة مرئية للمستخدم. وفقًا لوثائق مطوري Apple، تستقبل هذه الطريقة معلمة منطقية animated تشير إلى ما إذا كان الانتقال يحدث مع حركة. viewWillAppear هي المكان الرئيسي لتحديث البيانات ومزامنة حالة الشاشة.

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

  • يتم استدعاء viewWillAppear في كل مرة تظهر فيها الشاشة، على عكس viewDidLoad
  • يُستخدم لتحديث البيانات والمزامنة بعد العودة من شاشات أخرى
  • تشير المعلمة animated إلى ما إذا كان الظهور مصحوبًا بحركة
  • هنا يتم تكوين NavigationBar وTabBar وعناصر الواجهة الأخرى
  • مناسب للاشتراك في الإشعارات المؤقتة النشطة فقط عندما تكون الشاشة مرئية

ما هو viewWillAppear

viewWillAppear هي طريقة UIViewController يستدعيها UIKit فورًا قبل إضافة العرض إلى تسلسل النوافذ. في هذه المرحلة، يكون للعرض أبعاده النهائية بعد تمريرات Auto Layout، لكنه غير مرئي بعد للمستخدم — إما أن حركة الانتقال لم تبدأ أو أنها قيد التنفيذ. يقوم المطور بتجاوز هذه الطريقة لتنفيذ العمليات التي يجب أن تحدث قبل كل عرض للشاشة.

على عكس viewDidLoad الذي يتم تشغيله مرة واحدة فقط، يتم استدعاء viewWillAppear في كل مرة تكون فيها الشاشة على وشك الظهور: عند الفتح الأولي، عند العودة من وحدة تحكم فرعية، بعد إغلاق نافذة مشروطة، وعند تبديل علامات تبويب TabBar. وهذا يجعله طريقة رئيسية للحفاظ على حالة واجهة محدثة.

تقبل الطريقة معلمة animated من النوع Bool، والتي تكون true إذا كان ظهور الشاشة مصحوبًا بحركة. هذه المعلمة مناسبة لتمريرها إلى طرق NavigationBar وTabBar، التي لديها أيضًا معلمة مماثلة للسلوك المتسق.

متى يتم استدعاء viewWillAppear

يعتمد توقيت استدعاء viewWillAppear على نوع التنقل، لكن القاعدة العامة تبقى كما هي: يتم تشغيل الطريقة قبل أن يصبح العرض مرئيًا. دعنا نستعرض السيناريوهات الرئيسية.

عند الفتح الأول للشاشة

بعد viewDidLoad، يبدأ UIKit التحضير للعرض: تتم إضافة العرض إلى التسلسل الهرمي، ويتم تشغيل تمريرات layout، وقبل بدء حركة الانتقال مباشرة، يتم استدعاء viewWillAppear. في هذه اللحظة، الشاشة غير مرئية بعد، ولكن جميع العروض الفرعية لها أحجام صحيحة، ويمكن تحديث محتواها بأمان.

عند العودة من NavigationController

عندما ينقر المستخدم على زر الرجوع أو يستدعي popViewController برمجيًا، يعود UIKit إلى الشاشة السابقة ويستدعي viewWillAppear الخاص بها. هذا هو السيناريو الرئيسي لاستخدام viewWillAppear — تحديث قائمة بعد إضافة عنصر أو مزامنة الإعدادات.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
    updateBadgeCount()
}

عند إغلاق النافذة المشروطة

بعد إغلاق وحدة تحكم معروضة بشكل مشروط، يستدعي UIKit viewWillAppear على وحدة التحكم التي عرضتها. هذا السيناريو يتطلب اهتمامًا خاصًا إذا كنت تستخدم المفوضين أو عمليات الإغلاق لتمرير البيانات مرة أخرى — يضمن viewWillAppear تحديث الشاشة بعد تلقي النتيجة.

عند تبديل علامات تبويب TabBar

يستدعي TabBarController viewWillAppear على وحدة تحكم علامة التبويب المحددة في كل مرة يتم فيها التبديل. إذا كانت علامة التبويب تعرض بيانات ديناميكية — أسعار الصرف، الإشعارات، حالة المستخدم — فإن viewWillAppear هو المكان المثالي لتحديثها.

المهام العملية في viewWillAppear

viewWillAppear يحل عدة مهام محددة يستحيل أو من غير الأمثل تنفيذها في طرق أخرى. دعنا نستعرض أهمها.

تحديث بيانات الجدول

الاستخدام الأكثر شيوعًا لـ viewWillAppear هو إعادة تحميل UITableView أو UICollectionView في كل مرة تظهر فيها الشاشة. إذا كانت البيانات قد تغيرت في الشاشة السابقة (تمت إضافة عنصر، تغيرت الحالة)، فإن استدعاء reloadData في viewWillAppear يضمن رؤية المستخدم للمعلومات المحدثة.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    viewModel.synchronize()
    tableView.reloadData()
}

تكوين NavigationBar وTabBar

في viewWillAppear، يمكن تكوين مظهر NavigationBar بسهولة: إخفائها أو إظهارها، تغيير لونها، تعيين عنوان كبير. إذا كانت الشاشات المختلفة لها أنماط NavigationBar مختلفة، فإن viewWillAppear هو المكان الصحيح لهذه التغييرات، حيث يتم استدعاء viewDidLoad مرة واحدة فقط.

swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(
        false, animated: animated
    )
    navigationController?.navigationBar.prefersLargeTitles = true
    tabBarController?.tabBar.isHidden = false
}

الاشتراك في الإشعارات المؤقتة

الإشعارات التي تكون منطقية فقط عندما تكون الشاشة مرئية — إشعارات لوحة المفاتيح، إشعارات تغيير المحتوى — يتم الاشتراك فيها في viewWillAppear وإلغاء الاشتراك في viewDidDisappear. هذا يمنع المعالجات غير الضرورية عندما تكون الشاشة غير نشطة ويحمي من تسرب الذاكرة.

استعادة حالة الواجهة

إذا كان من الممكن إخفاء الشاشة بواسطة التطبيق أو تصغيرها، فإن viewWillAppear هو مكان مناسب لاستعادة حالة الواجهة: تبديل الأجزاء، استعادة موضع التمرير، إعادة تعيين التغييرات المؤقتة. المستخدم يحصل على الشاشة في حالة يمكن التنبؤ بها في كل مرة تظهر فيها.

تحديث الشارات والعدادات

في الشاشات التي تعرض عدادات للرسائل غير المقروءة أو التقييمات أو الإشعارات، فإن viewWillAppear هو المكان المناسب لتحديثها. إذا كان المستخدم قد غير الكمية في شاشة أخرى، يتم هنا استدعاء إعادة الحساب وتحديث UITabBarItem.badgeValue أو المؤشرات المخصصة. هذا يضمن أن المستخدم يرى دائمًا أرقامًا محدثة بغض النظر عن المدة التي قضاها في الشاشات الأخرى.

يجب إيلاء اهتمام خاص للعمل مع collectionView: إذا كانت البيانات على الشاشة معروضة كشبكة بها خلايا تحتوي على عدادات أو حالات، فيجب أن يكون تحديثها في viewWillAppear انتقائيًا. بدلاً من reloadData الكامل، استخدم reloadItemsAtIndexPaths للخلايا المرئية لتجنب الوميض وفقدان موضع التمرير.

الاختلافات بين viewWillAppear وviewDidLoad

فهم الفرق بين viewWillAppear وviewDidLoad هو أساس بنية UIViewController الصحيحة. هذه الطرق لها تردد استدعاء مختلف، وسياق مختلف، وغرض مختلف.

viewDidLoad يتم استدعاؤه مرة واحدة وهو مناسب للتكوين الذي لا يتغير بمرور الوقت: تسجيل الخلايا، تعيين المفوضين، تهيئة الثوابت. viewWillAppear يتم استدعاؤه في كل ظهور وهو مناسب للعمليات التي يجب تكرارها: تحديث البيانات، تكوين العناصر المرئية، مزامنة الحالة.

الخاصيةviewDidLoadviewWillAppear
الترددمرة واحدةفي كل مرة عند الظهور
العرض مرئيلالا (سيصبح مرئيًا قريبًا)
أبعاد العرضغير نهائيةنهائية
مناسب لـإعداد لمرة واحدةالتحديثات والمزامنة
الحركةغير قابل للتطبيقالمعلمة animated

القاعدة الذهبية: إذا كان يجب تنفيذ العملية مرة واحدة فقط — ضعها في viewDidLoad. إذا كان يجب تنفيذها في كل مرة تعود فيها إلى الشاشة — ضعها في viewWillAppear.

الأخطاء الشائعة في viewWillAppear

الاستخدام غير الصحيح لـ viewWillAppear يمكن أن يؤدي إلى مشاكل في الأداء وتحديثات مفرطة وحالة واجهة غير متناسقة. دعنا نستعرض الأخطاء الأكثر شيوعًا.

الخطأ الأول — تكرار منطق viewDidLoad. إذا قمت بتسجيل خلايا الجدول في كل من viewDidLoad وviewWillAppear، فسيتم تنفيذ التسجيل عدة مرات، على الرغم من أن الإعداد لمرة واحدة كافٍ. انقل جميع التكوينات لمرة واحدة إلى viewDidLoad.

الخطأ الثاني — reloadData غير المشروط في كل ظهور. إذا لم تتغير البيانات، فإن إعادة تحميل الجدول تسبب استعلامات غير ضرورية لمصدر البيانات وإعادة رسم الخلايا، مما يقلل الأداء. تحقق مما إذا كانت الحالة قد تغيرت بالفعل قبل استدعاء reloadData.

الخطأ الثالث — العمل مع طلبات الشبكة دون مراعاة أن الشاشة قد يتم إخفاؤها مرة أخرى قبل اكتمال الطلب. إذا بدأت طلب URLSession في viewWillAppear وانتقل المستخدم فورًا إلى شاشة أخرى، فقد يتم تطبيق النتيجة على عرض مخفي بالفعل. استخدم المهام القابلة للإلغاء أو تحقق من isViewLoaded وwindow قبل التحديث.

الخطأ الرابع — نسيان استدعاء super. عدم استدعاء super.viewWillAppear يمكن أن يعطل سلوك وحدات التحكم الأصلية (UINavigationController, UITabBarController) ويؤدي إلى معالجة غير صحيحة للإيماءات والانتقالات. super يجب استدعاؤه دائمًا.

الخطأ الخامس — تعديل القيود دون استدعاء layoutIfNeeded. إذا قمت بتغيير القيود برمجيًا في viewWillAppear، فإن UIKit لا يطبقها فورًا — تتراكم التغييرات حتى تمريرة layout التالية. للتطبيق الفوري للتغييرات بعد تعديل القيود، اتصل بـ view.layoutIfNeeded(). هذا مهم بشكل خاص عند ضبط ارتفاع العناصر المعتمدة على المحتوى.

الخطأ السادس — محاولة تنفيذ حركة في viewWillAppear. كما ذكرنا سابقًا، لا يزال UIKit يعالج حركة الانتقال، وقد تتنافس حركتك مع حركة النظام. إذا كنت بحاجة إلى ظهور عنصر بتأثير، استخدم حركة الدخول في viewDidAppear، وفي viewWillAppear فقط قم بتكوين الحالة الأولية: الشفافية 0، التحويل بمقياس 0.8، وهكذا.

الخطأ السابع — تجاهل المعلمة animated. بعض المطورين لا يتحققون من قيمة animated في viewWillAppear ويقومون بتنفيذ عمليات يجب أن تعتمد على وجود الحركة. على سبيل المثال، إخفاء NavigationBar عندما يكون animated = false يمكن القيام به بدون حركة، وعندما يكون animated = true — مع حركة، لجعل الانتقال يبدو سلسًا. قم دائمًا بتمرير المعلمة animated إلى طرق UIKit المناسبة.

الخطأ الثامن — تعديل الواجهة عندما تكون الشاشة غير مرئية. إذا بدأت طلب شبكة في viewWillAppear وقامت كتلة الإكمال بتحديث الواجهة عندما تكون الشاشة قد اختفت بالفعل، سيرى المستخدم وميضًا أو حالة غير متناسقة. تحقق دائمًا من isViewLoaded وwindow قبل تحديث الواجهة في عمليات الإغلاق. هذا الإجراء البسيط يمنع الأعطال وإعادة الرسم غير الضرورية للواجهة.

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

كيف يختلف viewWillAppear عن viewDidAppear؟

يتم استدعاء viewWillAppear قبل بدء حركة الظهور، عندما لا يكون العرض مرئيًا بعد. يتم استدعاء viewDidAppear بعد اكتمال الحركة، عندما تكون الشاشة معروضة بالكامل ومتاحة للتفاعل.

هل يمكن ألا يتم استدعاء viewWillAppear؟

في الظروف العادية، يتم استدعاء viewWillAppear دائمًا عند ظهور الشاشة. الاستثناء هو الإغلاق القسري للتطبيق، حيث لا يتوفر لدى UIKit وقت لاستدعاء طرق دورة الحياة.

هل أحتاج إلى استدعاء super.viewWillAppear؟

نعم، بالتأكيد. يستخدم UIKit هذا الاستدعاء للتنسيق الداخلي مع UINavigationController وUITabBarController. بدون super، قد تتعطل الإيماءات وحركات الانتقال.

كم مرة يتم استدعاء viewWillAppear في TabBarController؟

في كل تبديل لعلامة التبويب. يستدعي UIKit viewWillAppear على وحدة تحكم علامة التبويب المحددة فورًا بعد أن ينقر المستخدم على الأيقونة المقابلة في TabBar.

كيفية تمرير البيانات مرة أخرى عبر viewWillAppear؟

استخدم خصائص وحدة التحكم أو مصدر بيانات مشترك. قبل استدعاء popViewController، قم بتعيين القيم المطلوبة على وحدة التحكم السابقة، وستكون متاحة بالفعل في viewWillAppear الخاص بها.

الملخص

  • يتم استدعاء viewWillAppear قبل كل ظهور للشاشة، على عكس viewDidLoad لمرة واحدة
  • يُستخدم لتحديث بيانات الجداول والمجموعات وحالة الواجهة
  • تتيح المعلمة animated تكييف السلوك مع الانتقالات المتحركة وغير المتحركة
  • يتم تكوين NavigationBar وTabBar وعناصر التنقل الأخرى في viewWillAppear
  • الاشتراكات المؤقتة في الإشعارات هي حالة صالحة لـ viewWillAppear
  • تجنب تكرار منطق viewDidLoad وreloadData غير المشروط
  • اتصل دائمًا بـ super.viewWillAppear لسلوك تنقل صحيح

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

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

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

اقرأ أيضًا