مقدمة: لماذا لا يعمل UIAlertView الخاص بك (وما علاقة Stack Overflow بالأمر)
\n\nإذا كنت قد بحثت يومًا عن "How would I create a UIAlertView in Swift؟" — فأنت لست وحدك. هذا السؤال على Stack Overflow حصد مئات الآلاف من المشاهدات. قد يبدو الأمر بسيطًا: عرض نافذة منبثقة للمستخدم تحتوي على زر "موافق". لكن في الواقع، يقع المبتدئون (وحتى المحترفون) في نفس الأخطاء المتكررة.
\n\nفي هذا المقال، سنستعرض أهم 5 أخطاء عند إنشاء UIAlertView في Swift، ونوضح كيفية إصلاحها، ونقدم لك كودًا جاهزًا لاستخدام UIAlertController — البديل الحديث لواجهة البرمجة القديمة. إذا كنت ترغب في كتابة كود نظيف وخالٍ من الأعطال، تابع معنا.
\n\nالخطأ رقم 1: استخدام UIAlertView بدلاً من UIAlertController
\n\nالخطأ الأكثر شيوعًا هو محاولة استخدام UIAlertView في Swift الحديث. هذه الفئة تم إيقافها (deprecated) منذ iOS 8. إذا كتبت الكود التالي:
let alert = UIAlertView(title: "خطأ", message: "حدث خطأ ما", delegate: nil, cancelButtonTitle: "موافق")\nalert.show()\n\n... فمن المرجح أن يُصدر المترجم تحذيرًا أو خطأ. وحتى إذا تم تجميع المشروع، فلن يعمل التنبيه بشكل صحيح على iOS 13+.
\n\nلماذا يحدث هذا؟
\nقامت Apple باستبدال UIAlertView بـ UIAlertController منذ iOS 8. الفئة القديمة لم تعد مدعومة، وقد يؤدي استخدامها إلى سلوك غير متوقع.
كيف تصلحه؟
\nاستخدم UIAlertController مع النمط المفضل .alert أو .actionSheet. إليك الكود الصحيح:
let alert = UIAlertController(title: "خطأ",\n message: "حدث خطأ ما",\n preferredStyle: .alert)\nalert.addAction(UIAlertAction(title: "موافق", style: .default))\npresent(alert, animated: true)\n\nتذكر: في Swift الحديث، UIAlertView هو كود قديم. استخدم دائمًا UIAlertController.
الخطأ رقم 2: نسيان استدعاء present()
\n\nحتى إذا قمت بإنشاء UIAlertController ولكن نسيت عرضه — فلن يحدث شيء. حرفيًا. سيتم تنفيذ الكود، وسيتم إنشاء التنبيه في الذاكرة، لكن المستخدم لن يراه.
مثال نموذجي للخطأ:
\n\nfunc showAlert() {\n let alert = UIAlertController(title: "مرحبًا", message: "العالم", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "موافق", style: .default))\n // نسيت استدعاء present!\n}\n\nالنتيجة: صمت تام. لا خطأ، ولا تنبيه. ستتساءل لماذا لا يعمل الكود.
\n\nكيف تصلحه؟
\nاستدعِ دائمًا present(_:animated:completion:) على وحدة التحكم الحالية:
func showAlert() {\n let alert = UIAlertController(title: "مرحبًا", message: "العالم", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "موافق", style: .default))\n present(alert, animated: true, completion: nil)\n}\n\nنصيحة: إذا كنت تستدعي التنبيه من داخل إغلاق (closure) أو كود غير متزامن، تأكد من أن self (وحدة التحكم) لا تزال موجودة. وإلا فقد يتعطل التطبيق.
الخطأ رقم 3: معالجة غير صحيحة لضغط الأزرار
\n\nفي UIAlertView القديم، كنا نستخدم المفوض (delegate) alertView(_:clickedButtonAt:). أما في UIAlertController فالأمر مختلف — نستخدم الإغلاقات (closures).
غالبًا ما يحاول المبتدئون جعل الفئة تتوافق مع UIAlertViewDelegate وتنفيذ دوال المفوض، لكن هذا لن يعمل مع UIAlertController.
طريقة خاطئة:
\n\nclass ViewController: UIViewController, UIAlertViewDelegate {\n func showAlert() {\n let alert = UIAlertController(title: "سؤال", message: "هل توافق؟", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "نعم", style: .default))\n // كود ناقص...\n }\n}