阻止 UITextField 安全文本清除现有文本

Posted

技术标签:

【中文标题】阻止 UITextField 安全文本清除现有文本【英文标题】:Stop UITextField Secure Text From Clearing Existing Text 【发布时间】:2013-06-04 19:21:15 【问题描述】:

我有一个 UITextField,它是使用

声明的密码字段

passwordField.secureTextEntry = YES;

我的问题是,当我输入一半密码时,单击另一个组件,然后返回密码字段并再次开始输入,ios 会清除现有文本。

有没有办法防止这种情况发生或将其关闭?

-亨利

【问题讨论】:

【参考方案1】:

执行此操作的最简单方法是使用类似于此的代码为 UITextField 实现委托:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)replacementString 
  if (textField.text) 
      textField.text = [textField.text stringByReplacingCharactersInRange:range withString:replacementString];
   else 
      textField.text = replacementString;
  

  return NO;

【讨论】:

【参考方案2】:

默认情况下,不,您不能对安全文本字段执行此操作。不过你可以解决它。

实现委托方法textField:shouldChangeCharactersInRange:replacementString: 并使用传递的值来决定做什么。

即如果范围是整个字符串并且替换是空字符串,则不允许更改。新文本可能作为新键入的字符提供,您需要检查该方法实际接收的参数。

【讨论】:

只是出于好奇,您是否尝试过此解决方案,因为我刚刚遇到了类似的问题(显示/隐藏密码),而我的问题是当用户切换显示/隐藏按钮并且 textField 再次返回为secureTextEntry 光标位于字符串的末尾,但是如果输入了一个字符,则删除了前一个字符串,并且仅“保存”了新文本,最后我以编程方式将光标重新定位在 textField 的末尾,这样做了把戏。 @danypata 不,我实际上并没有尝试过,所以它可能需要一些调整,因为我不能确定替换将提供一个空字符串或新键入的字符。我会用这个更新答案。我实际上并没有尝试阻止安全文本字段的标准功能。 这个答案有误导性,UITextField被清除时的范围不是整个字符串,范围仍然是一个。【参考方案3】:

当我更改键盘类型以使我的密码组合为 4(digits)+1(alpha) 以停止清除 secureTextEntry 时,我遇到了同样的情况,

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
textField.keyboardType = UIKeyboardTypePhonePad;
[textField reloadInputViews];

return YES;

它会重新加载UITextField,但不会重新加载其文本,因此在不清除文本的情况下,它会将键盘从字母更改为数字,反之亦然。您可以将其用于您自己的功能。

【讨论】:

以上是关于阻止 UITextField 安全文本清除现有文本的主要内容,如果未能解决你的问题,请参考以下文章

清除 UITextField 的 text 属性的内容以供点击

UITextField 文本重叠清除按钮

UITextField 清除故障 - 文本突出显示,选择插入符号出现

阻止 UITextField 水平扩展

如何在 IOS 的 UIAlertView 中清除 UITextfield 文本和确定按钮?

按下按钮时在 UITableView 单元格中清除 UITextField 的文本