You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在UITextField中让密码显示为"*****"而非圆点?

嘿,这个问题我之前做项目的时候也遇到过!iOS默认开启isSecureTextEntry = true后确实只会显示圆点,要改成星号的话,咱们可以根据系统版本选择合适的方法:

方法一:iOS 13+ 原生支持(推荐)

从iOS 13开始,UITextField新增了passwordRules属性,咱们可以通过自定义密码规则来指定显示的星号字符,代码非常简洁:

// 创建自定义密码规则,指定显示字符为*
let passwordRule = UITextInputPasswordRule(descriptor: "required: any; allowed: any; display-character: *")
txtPassword.passwordRules = passwordRule
// 别忘了开启安全输入
txtPassword.isSecureTextEntry = true

这个方法是系统原生支持的,不需要额外处理代理逻辑,省心又靠谱,只要你的App支持iOS 13及以上,优先用这个!

方法二:兼容低版本(iOS 13以下)

如果需要兼容iOS 13之前的版本,咱们可以通过UITextField的代理手动处理输入,同时保存真实的密码内容:

步骤1:设置代理并关闭默认安全输入

txtPassword.delegate = self
// 先关闭默认的圆点显示,我们自己来处理
txtPassword.isSecureTextEntry = false

步骤2:实现代理方法并保存真实密码

在你的ViewController里添加一个变量存储真实密码,然后实现代理方法:

// 用来存储用户输入的真实密码
private var realPassword = ""

// 处理输入和修改操作
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let currentText = textField.text else { return false }
    // 计算更新后的真实密码
    let updatedRealPassword = (currentText as NSString).replacingCharacters(in: range, with: string)
    realPassword = updatedRealPassword
    // 显示对应长度的星号
    textField.text = String(repeating: "*", count: updatedRealPassword.count)
    // 返回false,因为我们已经手动更新了文本内容
    return false
}

// 处理清空操作
func textFieldShouldClear(_ textField: UITextField) -> Bool {
    realPassword = ""
    return true
}

⚠️ 注意:用这个方法的时候,获取密码一定要用realPassword变量,不能直接取txtPassword.text(因为里面全是星号)!

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

火山引擎 最新活动