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

Swift 中如何实现 UITextField 输入内容中间显示省略号的效果

UITextField实现中间省略号展示方案

可以实现,不需要依赖UITextView相关方案,通过自定义UITextField的输入截断逻辑即可完成私钥场景下首尾保留、中间省略的展示需求。

核心思路

不修改UITextField原生截断逻辑,通过输入代理监听内容变化,存储完整的原始私钥,仅对展示层的文本做中间截断处理,不影响实际业务使用的完整内容。

实现步骤

1. 定义必要存储属性

首先需要新增两个属性分别存储原始内容和配置展示规则:

// 存储完整的原始私钥,业务侧实际取值用这个属性
private var originalPrivateKey: String = ""
// 首尾各保留的字符数,可根据需求调整,私钥场景通常设为4~6即可
private let keepCharCount: Int = 4

2. 实现输入代理截断逻辑

在UITextField的textField(_:shouldChangeCharactersIn:replacementString:)代理方法中处理内容截断:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // 拼接得到最新的完整私钥内容
    let updatedString = (originalPrivateKey as NSString).replacingCharacters(in: range, with: string)
    originalPrivateKey = updatedString
    
    // 内容长度不足不需要截断,直接展示完整内容
    guard updatedString.count > keepCharCount * 2 else {
        textField.text = updatedString
        return true
    }
    
    // 拼接首尾内容加中间省略号赋值给展示层
    let prefix = String(updatedString.prefix(keepCharCount))
    let suffix = String(updatedString.suffix(keepCharCount))
    textField.text = "\(prefix)...\(suffix)"
    // 禁止原生默认赋值,使用自定义截断后的内容
    return false
}

3. 交互优化(可选)

如果需要支持复制功能,避免用户复制到截断后的内容,可以自定义UITextField子类重写复制方法:

class PrivateKeyTextField: UITextField {
    var originalContent: String = ""
    override func copy(_ sender: Any?) {
        UIPasteboard.general.string = originalContent
    }
}

注意事项

  • 业务侧需要使用私钥做校验、导出等操作时,必须取存储的originalPrivateKey,不要取UITextField的text属性,避免拿到截断后的无效内容
  • 如果需要适配不同宽度的输入框,可以通过计算文本宽度动态调整keepCharCount的数值,适配不同屏幕尺寸

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:45:01