كيفية إضافة placeholder في UITextView في Swift: دليل شامل

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

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

ابدأ الدورة

لماذا لا يحتوي UITextView على placeholder مدمج وكيفية تجاوز ذلك

\n\n

كل مطور iOS عمل مع UITextView واجه نفس المشكلة: على عكس UITextField، لا يحتوي UITextView على خاصية placeholder مدمجة. تقوم بإنشاء حقل إدخال نص متعدد الأسطر، وتشغيل التطبيق — وترى مستطيلاً أبيض فارغاً. المستخدم لا يفهم ما يجب إدخاله، والمصمم يشعر بالإحباط.

\n\n

لماذا لم تضف Apple هذه الخاصية؟ تاريخياً، كان UITextView يُستخدم لعرض وتحرير كميات كبيرة من النص (مثل الملاحظات أو رسائل البريد الإلكتروني)، وليس كحقل إدخال مع تلميح. لكن الأوقات تغيرت: اليوم نستخدم UITextView للتعليقات والوصف والسير الذاتية — في كل مكان نحتاج فيه إلى placeholder.

\n\n

في هذه المقالة، سنستعرض 3 طرق مثبتة لإضافة placeholder text inside UITextView in Swift. ستتعلم كيفية القيام بذلك باستخدام UILabel، وNSAttributedString، وإنشاء فئة فرعية خاصة بك. هيا بنا!

\n\n

الطريقة 1: UILabel التقليدي فوق UITextView

\n\n

أبسط وأوضح طريقة هي وضع UILabel فوق UITextView والتحكم في ظهوره. هذه الطريقة مثالية للمبتدئين وللمشاريع التي لا تتطلب تخصيصاً معقداً.

\n\n

كيف يعمل

\n\n

تقوم بإضافة UILabel كعنصر فرعي لـ UITextView، وتحدد نص placeholder، وتخفيه عندما يبدأ المستخدم في الكتابة. إليك مثال خطوة بخطوة:

\n\n
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

المزايا والعيوب

\n
    \n
  • المزايا: البساطة، سهولة الفهم، تعمل على أي إصدار من iOS.
  • \n
  • العيوب: تحتاج إلى مراقبة القيود (constraints) إذا تغيرت الهوامش الداخلية لـ textview. كما أنها لا تعمل إذا كان textview يحتوي على NSAttributedString بمحاذاة مختلفة.
  • \n
\n\n

الطريقة 2: Placeholder عبر NSAttributedString

\n\n

طريقة أكثر أناقة هي استخدام خصائص النص. الفكرة هي عرض placeholder كـ نص منسق باللون الرمادي، وعندما يبدأ المستخدم في الإدخال — يتم استبداله بالنص العادي.

\n\n

هذه الطريقة مفيدة بشكل خاص إذا كنت تعمل مع UITextView في Swift ولا تريد التعامل مع عناصر واجهة إضافية.

\n\n

التنفيذ

\n\n
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelega                

المدونات

توصيات الكتب