لماذا لا يحتوي UITextView على placeholder مدمج وكيفية تجاوز ذلك
\n\nكل مطور iOS عمل مع UITextView واجه نفس المشكلة: على عكس UITextField، لا يحتوي UITextView على خاصية placeholder مدمجة. تقوم بإنشاء حقل إدخال نص متعدد الأسطر، وتشغيل التطبيق — وترى مستطيلاً أبيض فارغاً. المستخدم لا يفهم ما يجب إدخاله، والمصمم يشعر بالإحباط.
لماذا لم تضف Apple هذه الخاصية؟ تاريخياً، كان UITextView يُستخدم لعرض وتحرير كميات كبيرة من النص (مثل الملاحظات أو رسائل البريد الإلكتروني)، وليس كحقل إدخال مع تلميح. لكن الأوقات تغيرت: اليوم نستخدم UITextView للتعليقات والوصف والسير الذاتية — في كل مكان نحتاج فيه إلى placeholder.
في هذه المقالة، سنستعرض 3 طرق مثبتة لإضافة placeholder text inside UITextView in Swift. ستتعلم كيفية القيام بذلك باستخدام UILabel، وNSAttributedString، وإنشاء فئة فرعية خاصة بك. هيا بنا!
الطريقة 1: UILabel التقليدي فوق UITextView
\n\nأبسط وأوضح طريقة هي وضع UILabel فوق UITextView والتحكم في ظهوره. هذه الطريقة مثالية للمبتدئين وللمشاريع التي لا تتطلب تخصيصاً معقداً.
كيف يعمل
\n\nتقوم بإضافة UILabel كعنصر فرعي لـ UITextView، وتحدد نص placeholder، وتخفيه عندما يبدأ المستخدم في الكتابة. إليك مثال خطوة بخطوة:
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelegate {\n \n @IBOutlet weak var textView: UITextView!\n let placeholderLabel = UILabel()\n \n override func viewDidLoad() {\n super.viewDidLoad()\n textView.delegate = self\n setupPlaceholder()\n }\n \n func setupPlaceholder() {\n placeholderLabel.text = "أدخل تعليقك هنا..."\n placeholderLabel.font = UIFont.systemFont(ofSize: 16)\n placeholderLabel.textColor = UIColor.lightGray\n placeholderLabel.translatesAutoresizingMaskIntoConstraints = false\n textView.addSubview(placeholderLabel)\n \n NSLayoutConstraint.activate([\n placeholderLabel.topAnchor.constraint(equalTo: textView.topAnchor, constant: 8),\n placeholderLabel.leadingAnchor.constraint(equalTo: textView.leadingAnchor, constant: 5),\n placeholderLabel.trailingAnchor.constraint(equalTo: textView.trailingAnchor, constant: -5)\n ])\n }\n \n func textViewDidChange(_ textView: UITextView) {\n placeholderLabel.isHidden = !textView.text.isEmpty\n }\n}\n\nهام: لا تنسَ تعيين المفوض UITextViewDelegate وتنفيذ طريقة textViewDidChange. إذا كنت تستخدم SwiftUI، فسيكون الأسلوب مختلفاً — حيث يتم استخدام المُعدِّل .overlay.
المزايا والعيوب
\n- \n
- المزايا: البساطة، سهولة الفهم، تعمل على أي إصدار من iOS. \n
- العيوب: تحتاج إلى مراقبة القيود (constraints) إذا تغيرت الهوامش الداخلية لـ textview. كما أنها لا تعمل إذا كان textview يحتوي على
NSAttributedStringبمحاذاة مختلفة. \n
الطريقة 2: Placeholder عبر NSAttributedString
\n\nطريقة أكثر أناقة هي استخدام خصائص النص. الفكرة هي عرض placeholder كـ نص منسق باللون الرمادي، وعندما يبدأ المستخدم في الإدخال — يتم استبداله بالنص العادي.
\n\nهذه الطريقة مفيدة بشكل خاص إذا كنت تعمل مع UITextView في Swift ولا تريد التعامل مع عناصر واجهة إضافية.
\n\nالتنفيذ
\n\nimport UIKit\n\nclass ViewController: UIViewController, UITextViewDelega