iOS 12 semble reconnaître les textFields de mot de passe également par isSecureTextEntry
et pas seulement par textContentType
Il n'est donc pas vraiment possible de faire disparaître cette vue accessoire, à moins de définir textContentType sur rien et de supprimer la fonction secureEntry (et de provoquer une faille de sécurité dans votre application), ce qui empêcherait alors iOS 12 de reconnaître le textField comme un textField de mot de passe et d'afficher cette vue accessoire gênante.
Dans mon cas, l'accessoire a causé un bug qui rendait mon application non réactive lorsqu'elle était touchée (ce qui a également entraîné le rejet de mon application dans le processus d'examen des applications). J'ai donc dû supprimer cette fonctionnalité. Je ne voulais pas renoncer à cette fonction de sécurité et j'ai donc dû résoudre les choses par moi-même.
L'idée est de supprimer la fonction secureEntry mais de l'ajouter vous-même manuellement. Cela a fonctionné :
On peut le faire comme ça :
Swift 4 voies :
D'abord, comme répondu ici, mettre textContentType
à rien :
if #available(iOS 10.0, *) {
passwordText.textContentType = UITextContentType("")
emailText.textContentType = UITextContentType("")
}
Ensuite, déclarez une variable String qui contiendra plus tard le contenu réel de notre textField :
var passwordValue = ""
Ajoutez une cible au passwordTextField, qui sera appelée chaque fois que le contenu du textField sera modifié :
passwordText.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
Maintenant, c'est ce qui va faire la magie, déclarer la fonction qui va gérer les remplacements de texte :
@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)
}
Enfin, définissez le champ de texte autocorrectionType
a .no
pour supprimer le texte prédictif :
passwordText.autocorrectionType = .no
C'est ça, utilisez passwordValue
pour effectuer votre connexion.
J'espère que ça aidera quelqu'un.
UPDATE
Il attrape les valeurs collées aussi, j'ai oublié de l'ajouter avant.