شريط الحالة في iOS: 5 أخطاء قاتلة في لون النص (Swift)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيف تغير لون نص Status Bar في iOS: 5 أخطاء قاتلة وكيف تتجنبها

\n\n

كل مطور iOS واجه هذا الموقف مرة على الأقل: تكتب تطبيقًا، تختار خلفية داكنة مثالية للشاشة، لكن Status Bar (شريط الحالة) لا يزال يعرض نصًا أسود. يبدو هذا غير احترافي على الأقل، والمستخدمون يكتبون في التعليقات: "لا أرى شيئًا". هل تشعر بهذا الألم المألوف؟

\n\n

سؤال "How to change Status Bar text color in iOS" هو واحد من أكثر الأسئلة شيوعًا على Stack Overflow مع عشرات الآلاف من المشاهدات. المشكلة أن المبتدئين (وليس فقط) يكررون نفس الأخطاء مرارًا وتكرارًا. في هذا المقال، سنحلل 5 أخطاء قاتلة تدمر شريط الحالة الخاص بك، ونوضح كيفية إصلاحها باستخدام Swift. هيا بنا!

\n\n

لماذا يعتبر Status Bar صداعًا؟

\n\n

iOS نظام صارم. لا يسمح لك ببساطة بتلوين Status Bar كما تشاء. كل شيء يتحكم فيه UIStatusBarStyle، وإذا كنت لا تعرف الآلية الدقيقة، يتحول الكود إلى تخمين. دعنا نفهم الأمر بشكل منهجي.

\n\n

الخطأ رقم 1: نسيان ملف Info.plist

\n\n

الخطأ الأكثر شيوعًا هو محاولة تغيير نمط Status Bar دون السماح بذلك في إعدادات المشروع. افتراضيًا، تدير iOS شريط الحالة بنفسها، ويتم تجاهل الكود الخاص بك.

\n\n
// ❌ خطأ: يوجد كود ولكن لا يوجد إذن\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n    return .lightContent\n}
\n\n

الحل: أضف المفتاح UIViewControllerBasedStatusBarAppearance إلى ملف Info.plist واجعله YES. بدون هذا، لن يكون لـ View Controller الخاص بك رأي.

\n\n
<key>UIViewControllerBasedStatusBarAppearance</key>\n<true/>
\n\n

الآن، سيسأل iOS كل وحدة تحكم: "ما نمط Status Bar الذي تريده؟" وسيعمل الكود الخاص بك.

\n\n

الخطأ رقم 2: وضع الكود في المكان الخطأ

\n\n

يكتب العديد من المبتدئين preferredStatusBarStyle داخل دالة viewDidLoad() أو viewWillAppear(). ثم يتفاجؤون بعدم حدوث أي تغيير.

\n\n
// ❌ خطأ: هذه خاصية وليست دالة\noverride func viewDidLoad() {\n    super.viewDidLoad()\n    preferredStatusBarStyle = .lightContent // لن يعمل!\n}
\n\n

الطريقة الصحيحة: preferredStatusBarStyle هي خاصية محسوبة (computed property) يطلبها iOS في كل مرة يحتاج فيها لتحديث Status Bar. يجب تعريفها على مستوى الفئة، وليس داخل دالة.

\n\n
// ✅ صحيح\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n    return .lightContent\n}
\n\n

إذا كنت بحاجة لتغيير النمط ديناميكيًا (مثل تغيير السمة)، استخدم setNeedsStatusBarAppearanceUpdate():

\n\n
var isDarkMode = false {\n    didSet {\n        setNeedsStatusBarAppearanceUpdate()\n    }\n}\n\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n    return isDarkMode ? .lightContent : .default\n}
\n\n

الخطأ رقم 3: تجاهل Navigation Controller

\n\n

إذا كان تطبيقك يستخدم UINavigationController، فقد لا يعمل preferredStatusBarStyle الخاص بوحدة التحكم الفرعية. لماذا؟ لأن Navigation Controller يدير Status Bar بنفسه.

\n\n

الحل رقم 1 (بسيط): تجاوز الخاصية في Navigation Controller.

\n\n
class CustomNavigationController: UINavigationController {\n    override var preferredStatusBarStyle: UIStatusBarStyle {\n        return topViewController?.preferredStatusBarStyle ?? .default\n    }\n}
\n\n

الحل رقم 2 (نظيف): استخدم childForStatusBarStyle. هذه طريقة أكثر مرونة تفوض التحكم إلى وحدة التحكم الفرعية.

\n\n
class CustomNavigationController: UINavigationController {\n    override var childForStatusBarStyle: UIViewController? {\n        return topViewController\n    }\n}
\n\n

الخطأ رقم 4: عدم تحديث Status Bar بعد تغيير الخلفية

\n\n

يغير بعض المطورين لون الخلفية في viewWillAppear لكنهم ينسون تحديث Status Bar. النتيجة: خلفية داكنة مع نص داكن، أو العكس.

\n\n
// ❌ خطأ: تغيير الخلفية دون تحديث Status Bar\noverride func viewWillAppear(_ animated: Bool) {\n    super.viewWillAppear(animated)\n    view.backgroundColor = .black // الخلفية أصبحت داكنة\n    // لكن Status Bar لا يزال فاتحًا!\n}
\n\n

الحل: استدعِ setNeedsStatusBarAppearanceUpdate() بعد تغيير الخلفية.

\n\n
override func viewWillAppear(_ animated: Bool) {\n    super.viewWillAppear(animated)\n    view.backgroundColor = .black\n    setNeedsStatusBarAppearanceUpdate()\n}\n\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n    return .lightContent // نص أبيض على خلفية داكنة\n}
\n\n

الخطأ رقم 5: استخدام الطرق القديمة (iOS 13+)

\n\n

قبل iOS 13، كان بإمكانك استخدام UIApplication.shared.statusBarStyle. لكن هذه الطريقة أصبحت مهملة (deprecated) منذ iOS 13. إذا كنت لا تزال تستخدمها، فسيتم تجاهلها في الإصدارات الحديثة.

\n\n
// ❌ خطأ: طريقة قديمة ومهملة\nUIApplication.shared.statusBarStyle = .lightContent
\n\n

الحل: استخدم الطريقة الحديثة عبر preferredStatusBarStyle كما شرحنا أعلاه. إذا كنت تدعم iOS 12 والإصدارات الأقدم، يمكنك استخدام التحقق من الإصدار:

\n\n
if #available(iOS 13, *) {\n    // استخدم الطريقة الجديدة\n    setNeedsStatusBarAppearanceUpdate()\n} else {\n    // استخدم الطريقة القديمة للإصدارات الأقدم\n    UIApplication.shared.statusBarStyle = .lightContent\n}
\n\n

الخلاصة: قائمة تحقق سريعة

\n\n
    \n
  1. تأكد من إضافة UIViewControllerBasedStatusBarAppearance = YES في Info.plist.
  2. \n
  3. استخدم preferredStatusBarStyle كخاصية محسوبة على مستوى الفئة.
  4. \n
  5. تعامل مع Navigation Controller بشكل صحيح باستخدام childForStatusBarStyle.
  6. \n
  7. استدعِ setNeedsStatusBarAppearanceUpdate() عند تغيير الخلفية أو السمة.
  8. \n
  9. تجنب الطرق القديمة والمهملة في iOS 13+.
  10. \n
\n\n

الآن أنت جاهز لجعل Status Bar في تطبيقك يبدو احترافيًا في أي ظرف. جرب هذه الحلول في مشروعك القادم، ولن تواجه مشاكل مع لون النص بعد الآن!

المدونات

توصيات الكتب