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

切换iOS TextField的isSecureTextEntry时光标位置异常(iPhone 6)

解决iOS TextField切换isSecureTextEntry时光标位置错误的问题

我之前在iPhone 6上也碰到过一模一样的问题,直接用textField?.isSecureTextEntry = !textField.isSecureTextEntry切换密码可见性时,光标总会跳错位置,给你几个亲测有效的解决办法:

方法一:保存并恢复光标选中范围

这是最常用的方案,切换属性前后手动记录和恢复光标位置,能完美适配大部分场景:

// 先保存当前光标选中的范围
let selectedRange = textField?.selectedTextRange
// 切换密码可见状态
textField?.isSecureTextEntry = !textField.isSecureTextEntry
// 恢复之前的光标位置
textField?.selectedTextRange = selectedRange

方法二:重置文本并定位光标到末尾

如果第一种方法偶尔还是有异常,可以尝试先保存文本,切换后重新赋值再精准定位光标:

let currentText = textField?.text
textField?.isSecureTextEntry = !textField.isSecureTextEntry
// 重新设置文本确保内容完全一致
textField?.text = currentText
// 将光标定位到文本末尾(也可根据需求调整到其他位置)
if let endPosition = textField?.endOfDocument {
    textField?.selectedTextRange = textField?.textRange(from: endPosition, to: endPosition)
}

方法三:延迟执行适配旧系统

iPhone 6搭载的iOS版本通常比较旧,有时候UI更新会有延迟,用异步队列包裹操作可以避免这个问题:

DispatchQueue.main.async {
    let selectedRange = self.textField?.selectedTextRange
    self.textField?.isSecureTextEntry = !self.textField.isSecureTextEntry
    self.textField?.selectedTextRange = selectedRange
}

问题原因小科普

之所以会出现光标位置错误,是因为切换isSecureTextEntry属性时,系统会重新渲染TextField的内容,默认会把光标重置到文本开头,所以手动保存并恢复选中范围就能从根源解决这个问题啦。

内容的提问来源于stack exchange,提问作者Pramod More

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:07:52