截至目前,我想选择退出iOS 11提供的新选项,即在应用程序中建议密码.当我在iOS 11上运行应用程序时,我在键盘顶部获得了自动填充选项,我的用户名和密码文本字段甚至都没有出现.
所以,我的问题是,如何一起禁用新密码自动填充功能,以便键盘上的键完全不显示,整体行为与iOS 11之前的相同?
Bar*_*mre 63
iOS 11和12 - Swift 4.2(更新):
if #available(iOS 12, *) {
// iOS 12 & 13: Not the best solution, but it works.
passwordTextField.textContentType = .oneTimeCode
} else {
// iOS 11: Disables the autofill accessory view.
// For more information see the explanation below.
emailTextField.textContentType = .init(rawValue: "")
passwordTextField.textContentType = .init(rawValue: "")
}
Run Code Online (Sandbox Code Playgroud)
iOS 11说明:
确保UITextField像这样设置所有对象.
例如,如果您有一个UITextField用户必须输入其电子邮件地址的对象,另一个用户必须输入密码的对象必须分配UITextContentType("")给他们的两个textContentType属性.否则它将无法工作,仍会显示自动填充附件视图.
iOS 12似乎也通过isSecureTextEntry属性而不仅仅通过textContentType属性来识别密码textFields ,因此除非你将textContentType设置为空,并删除secureEntry功能(并在你的应用程序中导致安全漏洞),否则不可能使这个附件视图消失然后阻止iOS 12将textField识别为密码textField并显示这个烦人的配件视图.
在我的情况下,配件导致了一个错误,当我点击时我的应用程序没有响应(这也使我的应用程序在应用程序审核过程中被拒绝).所以我不得不删除此功能.我不想放弃这个安全功能所以我必须自己解决问题.
我们的想法是删除secureEntry功能,但手动添加它.它确实有效:
它可以这样做:
Swift 4路:
首先,在这里回答,设置textContentType为空:
if #available(iOS 10.0, *) {
passwordText.textContentType = UITextContentType("")
emailText.textContentType = UITextContentType("")
}
Run Code Online (Sandbox Code Playgroud)
然后,声明一个String变量,该变量稍后将包含我们的textField真实内容:
var passwordValue = ""
将目标添加到passwordTextField,每次textField内容更改时都会调用该目标:
passwordText.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
Run Code Online (Sandbox Code Playgroud)
现在,这将是魔术,声明将处理文本替换的函数:
@objc func textFieldDidChange(_ textField: UITextField) {
if textField.text!.count > 1 {
// User did copy & paste
if passwordValue.count == 0 { // Pasted into an empty textField
passwordValue = String(textField.text!)
} else { // Pasted to a non empty textField
passwordValue += textField.text!.substring(from: passwordValue.count)
}
} else {
// User did input by keypad
if textField.text!.count > passwordValue.count { // Added chars
passwordValue += String(textField.text!.last!)
} else if textField.text!.count < passwordValue.count { // Removed chars
passwordValue = String(passwordValue.dropLast())
}
}
self.passwordText.text = String(repeating: "•", count: self.passwordText.text!.count)
}
Run Code Online (Sandbox Code Playgroud)
最后,将textField设置autocorrectionType为.noto以删除预测文本:
passwordText.autocorrectionType = .no
Run Code Online (Sandbox Code Playgroud)
就是这样,用于passwordValue执行登录.
希望它能帮助别人.
UPDATE
它也捕获粘贴的值,忘了之前添加它.
回应@Gal Shahar 的回答。
iOS 12按isSecureTextEntry属性识别密码文本字段,而不仅仅是按textContentType属性。
绕过自动填充建议的方法。
isSecureTextEntry 属性设置为 false。self.passwordTextField.secureTextEntry = NO;
isSecureTextEntry 属性。- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField == self.passwordTextField && !self.passwordTextField.secureTextEntry) {
self.passwordTextField.secureTextEntry = YES;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
注: -执行不使用shouldBeginEditing的UITextField委托方法它仍然会显示自动填充建议。千万不要使用textFieldDidChange的UITextField委托方法它会自动删除第一charachter为显示第一charachter后,它会发生。'secureTextEntry' 将清空该字段。
可以通过指定既不是用户名也不是密码的内容类型来禁用该功能.例如,如果用户应输入电子邮件地址,则可以使用
usernameTextField?.textContentType = .emailAddress
Run Code Online (Sandbox Code Playgroud)
您可以像这样为UITextContentType添加扩展名
extension UITextContentType {
public static let unspecified = UITextContentType("unspecified")
}
Run Code Online (Sandbox Code Playgroud)
之后,你可以使用它
if #available(iOS 10.0, *) {
passwordField.textContentType = .unspecified
}
Run Code Online (Sandbox Code Playgroud)
ios11中一个非常简单的方法为我工作.假设您的iboutlet是usernametextfield和passwordtextfield.在viewcontroller的viewDidLoad()函数中,保存两者都使用以下代码
usernametextfield.textContentType = UITextContentType("")
passwordtextfield.textContentType = UITextContentType("")
Run Code Online (Sandbox Code Playgroud)
在此之后,当您点击文本字段时,您将看不到自动填充附件选项.
小智 5
Objective-C的
if (@available(iOS 10, *)){
self.tfEmail.textContentType = @"";
self.tfPassword.textContentType = @"";
}
Run Code Online (Sandbox Code Playgroud)
这对我有用.
小智 2
您可以在此处尝试不同的答案,得出的结论是可能会删除附件视图。但这留下了一些错误。
您可以尝试实现一个自定义键盘,仅用于密码字段。还尝试禁用文本字段的建议,我认为这也会隐藏accessoryView.
编辑:苹果论坛上仍然没有关于同一问题的答案。UITextField另外我在官方文档中找不到与此相关的任何内容。
| 归档时间: |
|
| 查看次数: |
23500 次 |
| 最近记录: |