如何解决UITextView光标无法定位在占位符文本开头的问题
UITextView占位符光标无法移至开头的解决方法
问题原因
在textViewDidBeginEditing方法中直接设置selectedRange时,系统会在该方法执行完毕后自动触发一次光标位置重置(默认定位到文本末尾),导致你的光标设置被覆盖,所以光标始终停在占位符末尾。
解决方案
通过主队列异步执行光标位置设置,让系统的默认光标定位操作先完成,再覆盖它的设置。同时可以优化占位符的判断逻辑,避免硬编码字符串的潜在问题。
修改后的代码如下:
class MainViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate { @IBOutlet weak var definitionField: UITextView! // 定义占位符常量,避免硬编码 private let placeholderText = "translation" override func viewDidLoad() { super.viewDidLoad() // 设置占位符 definitionField.textColor = .gray definitionField.text = placeholderText definitionField.delegate = self } func textViewDidBeginEditing(_ textView: UITextView) { guard textView.text == placeholderText else { return } textView.textColor = .black // 异步执行光标设置,避开系统默认的光标定位 DispatchQueue.main.async { textView.selectedRange = NSMakeRange(0, 0) } } func textViewDidEndEditing(_ textView: UITextView) { let trimmedText = textView.text.trimmingCharacters(in: .whitespacesAndNewlines) if trimmedText.isEmpty { textView.text = self.placeholderText textView.textColor = .gray } textView.resignFirstResponder() } }
额外优化点
- 提取占位符为常量,避免多处硬编码字符串,方便后续修改
- 结束编辑时判断去除空白字符后的文本是否为空,避免用户输入空格后仍显示占位符的问题
内容的提问来源于stack exchange,提问作者Dude1313
相关产品推荐
相关产品推荐

