You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:42:37