- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 secureTextEntry = true
将标签中的字符串更改为“••••••••••••••”。它工作完美,但我如何更改整个字符串,除了字符串中的最后 4 个字符?
最佳答案
此处的情况取决于您如何使用此字符串:在 UILabel 中,还是在 UITextField 中。无论哪种方式,最好的办法是像这样扩展 String 来执行以下操作:
extension String {
init(withSecureShowOnlyLast4 values : String) {
self.init()
let array = [Character](values.characters)
if array.count <= 4 {
self = values
} else {
var first = array.count - 4
var lastFour : [Character] = []
while first <= (array.count - 1) {
lastFour.append(array[first])
first += 1
}
self = String(Array(repeating: "•", count: array.count - 4) + lastFour)
}
}
}
let pass : String = "fesnjufodpsk"
let obfs = String(withSecureShowOnlyLast4: pass) //prints : ••••••••dpsk
根据您的需要,这就是我使用它的方式:
UILABEL:
这是一个自定义类,可确保安全地保存您想要的数据。
class SafeLabel : UILabel {
var makeSafe : Bool = false
private var safeKey : String?
private var alternateSet = Bool()
override var text: String? {
didSet {
if makeSafe && !alternateSet {
alternateSet = true
safeKey = text
self.text = nil
} else if alternateSet {
alternateSet = false
}
}
willSet {
if makeSafe && !alternateSet {
self.safeKey = text
}
}
}
var safe : String {
get {
guard let sa = safeKey else {
return ""
}
guard makeSafe else {
return sa
}
return String(withSecureShowOnlyLast4: sa)
}
}
}
let lab = SafeLabel()
lab.makeSafe = true
lab.text = "9j3od3dkuhosfg"
print(lab.safe) //prints ••••••••••osfg
请注意 .makeSafe 的使用,它会一起删除数据的打印和使用(而不是删除它)。
对于 UITEXTFIELD:
对于此类,我将使用 textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
方法来修改字符串。在这里,我将像这样子类化 TextField,并像这样更改 protected 字符串:
class SafeField : UITextField {
var makeSafe : Bool = false
private var safeKey : String?
private var alternateSet = Bool()
override var text: String? {
didSet {
if makeSafe && !alternateSet {
alternateSet = true
safeKey = text
self.text = nil
} else if alternateSet {
alternateSet = false
}
}
willSet {
guard text != nil else {
if let t = safeKey, t.characters.count == 1 || t.isEmpty {
self.safeKey = nil
} else {
isDeletingEntry()
}
return
}
if makeSafe && !alternateSet, let t = text {
if let s = safeKey {
self.safeKey = s + t
} else {
self.safeKey = t
}
}
}
}
var safe : String {
get {
guard let sa = safeKey else {
return ""
}
guard makeSafe else {
return sa
}
return String(withSecureShowOnlyLast4: sa)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
}
private func isDeletingEntry() {
if let old = safeKey {
let new = String(old.characters.dropLast())
self.text = new
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class View: UIView, UITextFieldDelegate {
//Of course, this can be a ViewController, or anything that can handle the
//code bellow
var safe : SafeField = {
var s = SafeField()
s.makeSafe = true
return s
}()
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(safe)
safe.frame = .zero
safe.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard safe != textField else {
if string.characters.isEmpty {
safe.text = nil
} else {
safe.text = string
}
return false
}
return true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
显然,在检索值时,您需要使用 safe
而不是 text
,因为 text
总是硬编码为 nil
,考虑到混淆标签在 UI 开发中总是少数,我认为这应该不是问题。要从 TextField 获取值,您需要将 makeSafe 变量设置为 false 以检索字符串的未混淆值。以安全为主要焦点,这里的优点是您可以设置代码以根据需要在任何地方设置和取消设置 makeSafe 变量,而不必担心某些东西或某人直接从另一个文件访问它的值。
当然,如果您使用键盘元素或某种协议(protocol)直接修改 UILabel,只需将 SafeLabel 的文本变量替换为 SafeField 中的文本变量。 (如果您使用的是自定义协议(protocol),请确保通过可选转换检查标签确实是 SafeLabel :
func protocolMethod(label: UILabel, doSomething: Bool) {
guard let lab = label as? SafeLabel else {
//do your stuff
return
}
//Here you can manipulate lab as a SafeLabel and modify it according to the SafeLabel SubClass
}
关于ios - 单独部分的 secureTextEntry -- swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44526375/
我正在尝试从只能以编程方式创建的文本字段中输入密码,而不是通过界面生成器,但是当我尝试将 secureTextEntry 设置为“true”时,我只是得到一个“‘UITextField’类型的值有没有
我在 IB 中创建了一个文本字段。我已将键盘类型设置为 Numeric Pad在IB中。当我做secureTextEntry = YES时在-(void)textFieldDidBeginEditin
我正在使用 UITextField + secureTextEntry 来捕获密码。 SDK 中是否有一个属性可以让我仅显示刚刚输入的字符大约半秒,然后将其屏蔽?我正在寻找与 Apple 在所有默认应
我用 secureTextEntry = true 将标签中的字符串更改为“••••••••••••••”。它工作完美,但我如何更改整个字符串,除了字符串中的最后 4 个字符? 最佳答案 此处的情况取
可能重复 Here & here (但他们没有解决我的问题) 我正在创建一个聊天 UI,其中我的文本框必须同时具有多行 功能和安全文本输入 功能。 UITextField 没有多行功能 UITextV
我有一个 UITextField 用作密码字段。它默认 secureTextEntry 设置为 true。我还有一个 UIButton 来切换密码的显示/隐藏。 当我将文本字段从 secureText
我在 UITextField 中使用自定义字体,该字体已打开 secureTextEntry。当我在单元格中输入时,我会看到我选择的字体的项目符号,但是当字段失去焦点时,这些项目符号会恢复为系统标准字
当secureTextEntry为true时,有没有办法在react-native中更改textInput的样式。我想显示星星(*)而不是隐藏文本的点。 最佳答案 您可以实现自己的 TextInput
我正在尝试让 UITextView(不是 UITextField)充当密码字段,其中的文本在您输入时会被混淆。但是,在 UITextView 上将此属性设置为 YES 似乎没有任何效果,并且字母始终可
当键盘出现时,我正在尝试向上移动我的 self.view。 我用的是普通的: NSNotificationCenter.defaultCenter().addObserver(self, select
我试图隐藏用作密码输入的 UITextView 的文本,使用点而不是实际文本。此 TextView 称为 TV_Password。当它为空时,文本不应该被隐藏,应该被字符串“密码”替换 我在网上发现解
我正在尝试切换密码文本字段,但我遇到了文本字段右侧空白的问题。 //眼睛按钮 Action 。 @IBAction func btnEyePassword(sender: AnyObject) {
我在 UITextField 中使用自定义字体,它打开了 secureTextEntry。当我在单元格中输入时,我看到了我选择的字体的项目符号,但是当该字段失去焦点时,这些项目符号恢复为系统标准字体。
我有一个在显示/隐藏模式之间切换的按钮(即在 secureTextEntry NO 和 YES 之间切换 UITextField)。其目的是让用户看到他们输入的密码。 我按照这里的例子(票数最高):U
TextInput 的这两个属性与 android 不兼容: 自动更正 secureTextEntry 我在使用自动更正时遇到以下错误: Error while updating property '
我发现secureTextEntry在iOS 11.0上不起作用,我的代码很简单,如下所示: tfPwd1.keyboardType = UIKeyboardTypeNumberPad; tfPwd1
我正在寻找一种方法来在其中一个 UITextFields secureTextEntry 更改值时获得回调或事件。 我需要这个的原因如下。 我扩展了 UITextField 使其具有通过 UIText
所以我输入的密码如下: 并应用此样式: inputStyle { fontSize: 30, color: '#333', fontWeight: '900' } 但是这些样式似乎
来自 UITextfield 和 secureTextEntry 的奇怪行为。平台:iOS10在 iPhone(设备)和模拟器上。当 secureTextEntry 打开时,UITextfield 因
我遇到了更改密码字段语言的问题。在我的应用程序中,我需要在不关心当前语言环境的情况下以希伯来语输入登录名/密码。当我尝试输入登录名时,一切正常,我可以将键盘更改为希伯来语并输入登录名。但是当我尝试在安
我是一名优秀的程序员,十分优秀!