如何在Swift中为UITextView添加占位符:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么UITextView没有内置占位符以及如何解决

\n\n

每个iOS开发者,只要曾经使用过UITextView,都会遇到同样的问题:与UITextField不同,UITextView没有内置的placeholder属性。您创建一个多行文本输入框,运行应用程序——然后看到一个空白的白色矩形。用户不知道应该输入什么,而设计师则感到不满。

\n\n

为什么Apple没有添加这个属性?从历史上看,UITextView被定位为用于显示和编辑大量文本(例如笔记或邮件)的元素,而不是带有提示的输入字段。但时代变了:今天我们将UITextView用于评论、描述、个人简介——任何需要占位符的地方。

\n\n

在本文中,我们将介绍3种经过验证的方法,在Swift中为UITextView添加占位符文本。您将了解如何通过UILabel、通过NSAttributedString属性以及通过创建自定义子类来实现。开始吧!

\n\n

方法1:经典的UILabel覆盖在UITextView之上

\n\n

最简单且最直观的方法是将UILabel放置在UITextView之上,并控制其可见性。这种方法非常适合初学者以及不需要复杂自定义的项目。

\n\n

工作原理

\n\n

您将UILabel添加为UITextView的子视图,设置其占位符文本,并在用户开始输入时隐藏它。以下是分步示例:

\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
  • 缺点:如果textview的insets发生变化,需要关注约束。此外,如果textview具有不同对齐方式的NSAttributedString,则此方法无效。
  • \n
\n\n

方法2:通过NSAttributedString实现占位符

\n\n

更优雅的方法是使用字符串属性。其思路是将占位符显示为属性文本,颜色为灰色,当用户开始输入时,将其替换为普通文本。

\n\n

如果您在Swift中使用UITextView并且不想为额外的视图而烦恼,这种方法特别有用。

\n\n

实现

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

博客

书籍推荐