إغلاق لوحة المفاتيح في iOS باللمس: الأنماط المضادة و3 حلول عملية بلغة Swift

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

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

ابدأ الدورة

مقدمة: لماذا لا تغلق لوحة المفاتيح نفسها؟

\n

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

\n\n

هذا أحد أكثر المواضيع شيوعًا على Stack Overflow، حيث حصد سؤال "Close iOS Keyboard by touching anywhere using Swift" آلاف المشاهدات. المشكلة ليست في صعوبة الأمر. المشكلة هي أن المبتدئين (وليس فقط) غالبًا ما يختارون طرقًا غير صحيحة أو "قذرة". دعنا نستعرض أهم 3 أخطاء، ثم ننظر إلى ثلاثة حلول صحيحة وعملية.

\n\n

اليوم نتحدث عن Swift وUIKit. إذا كنت تستخدم SwiftUI — يمكنك الاطلاع أيضًا، المبادئ متشابهة.

\n\n

الخطأ رقم 1: "إضافة TapGesture على كل شيء"

\n

الخطأ الأكثر شيوعًا هو إضافة UITapGestureRecognizer إلى UIView، ولكن نسيان تعطيل cancelsTouchesInView. ونتيجة لذلك، تتوقف الأزرار والجداول عن الاستجابة للنقرات. ينقر المستخدم على زر "إرسال"، لكن يتم إغلاق لوحة المفاتيح بدلاً من إرسال النموذج.

\n\n

مثال على الكود الخاطئ:

\n
override func viewDidLoad() {\n    super.viewDidLoad()\n    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))\n    view.addGestureRecognizer(tap)\n}\n\n@objc func dismissKeyboard() {\n    view.endEditing(true)\n}
\n\n

للوهلة الأولى — كل شيء على ما يرام. لكن عمليًا، إذا كان لديك UITableView أو UIButton، فقد يتم "ابتلاع" نقراتها بواسطة هذه الإيماءة. هذا ملحوظ بشكل خاص عند إضافة هذه الإيماءة إلى scrollView.

\n\n

كيفية الإصلاح:

\n

أضف السطر tap.cancelsTouchesInView = false. سيسمح هذا للعناصر الأخرى في الواجهة باستقبال أحداث اللمس.

\n\n
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))\ntap.cancelsTouchesInView = false\nview.addGestureRecognizer(tap)
\n\n

ولكن حتى هذا ليس حلاً مثالياً إذا كان لديك واجهة معقدة.

\n\n

الخطأ رقم 2: "النقر على مساحة فارغة يعطل الجدول"

\n

المشكلة الشائعة الثانية هي التفاعل غير الصحيح مع UIScrollView أو UITableView. إذا أضفت UITapGestureRecognizer إلى view التي تحتوي على جدول، فعند النقر على خلية قد يتم تفعيل كل من الإيماءة وطريقة didSelectRow في نفس الوقت. أو الأسوأ من ذلك، أن الإيماءة ستعترض اللمس، ولن يتم تمييز الخلية.

\n\n

الحل: استخدم UIGestureRecognizerDelegate

\n

قم بتنفيذ الطريقة gestureRecognizer(_:shouldReceive:) وتحقق مما إذا كان النقر قد وقع على حقل نصي أو عنصر آخر. إذا كان اللمس على UITextField أو UITextView — لا تمنع الإيماءة.

\n\n
extension ViewController: UIGestureRecognizerDelegate {\n    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {\n        // لا نعترض اللمسات إذا كانت على حقل نصي\n        if touch.view is UITextField || touch.view is UITextView {\n            return false\n        }\n        return true\n    }\n}
\n\n

الآن ستعمل الإيماءة فقط عند النقر على المناطق الفارغة، بينما ستبقى الحقول النصية قابلة للتفاعل.

\n\n

الخطأ رقم 3: "نسيان زر العودة من لوحة المفاتيح"

\n

يقوم العديد من المطورين بتنفيذ الإغلاق عند النقر، لكنهم ينسون زر "Return" (Enter) على لوحة المفاتيح. قد يضغط المستخدم على "تم" ويتوقع إغلاق لوحة المفاتيح. إذا لم يتم ذلك — ستحصل على تجربة مستخدم سلبية.

\n\n

كيفية الإصلاح:

\n

قم بالاشتراك في بروتوكول UITextFieldDelegate ونفذ الطريقة textFieldShouldReturn:

\n\n
class View                

المدونات

توصيات الكتب