如何在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




