115 votes

Comment désactiver l'édition de UITextField tout en acceptant le tactile ?

Je fais un UITextField qui a un UIPickerView comme inputView . Tout va bien, sauf que je peux modifier par copier, coller, couper et sélectionner le texte, et je ne le veux pas. Seul le Picker devrait modifier le champ de texte.

J'ai appris que je peux désactiver l'édition en définissant les paramètres suivants setEnabled ou setUserInteractionEnabled à NO . Ok, mais le TextField ne répond plus au toucher et le sélecteur ne s'affiche pas.

Que puis-je faire pour l'atteindre ?

139voto

Nick Lockwood Points 23277

En utilisant le délégué du champ de texte, il y a une méthode

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

Si vous renvoyez la réponse NO, toute tentative de l'utilisateur de modifier le texte sera rejetée.

De cette façon, vous pouvez laisser le champ activé mais empêcher les gens d'y coller du texte.

4 votes

Si vous voulez toujours répondre au toucher, répondez à "toucher vers le bas" et non à "toucher vers l'intérieur". Sinon, votre événement ne sera jamais appelé.

0 votes

@NickLockwood existe-t-il un moyen de permettre au textField de devenir le premier répondeur, mais en désactivant l'interaction avec l'utilisateur et en masquant le curseur ?

1 votes

@entropy Je suppose que vous voulez pouvoir sélectionner le contenu pour que l'utilisateur puisse le copier ? Si vous sous-classez UITextField, vous pouvez surcharger à peu près n'importe quel comportement - par exemple, vous pourriez forcer le champ à toujours sélectionner tout lorsque l'utilisateur le touche, ce qui cacherait effectivement le curseur.

27voto

lee Points 3543

Traduisez la réponse de Nick pour être rapide :

P/S : Retourner false => les champs de texte ne peuvent pas être saisis, édités par le clavier. Il peut seulement définir le texte par le code. EX : textField.text = "Ma chaîne ici".

override func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return false
}

4 votes

Cela ne fonctionne pas pour moi. Il suffit de faire un clic long sur le champ de texte jusqu'à ce que le zoom apparaisse et que le menu couper/copier/coller d'iOS apparaisse, ce qui me permet de modifier le texte.

4 votes

Swift 4 : ` func textField(_ textField : UITextField, shouldChangeCharactersIn range : NSRange, replacementString string : String) -> Bool { return false } `

16voto

Ankish Jain Points 109

Ce serait le plus simple de tous :

dans viewDidLoad :(définir le délégué uniquement pour les champs de texte qui ne doivent pas être modifiables.

self.textfield.delegate=self;

et insérer cette fonction déléguée :

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return NO;
}

C'est ça !

31 votes

Cela empêche la présentation du sélecteur et ne résout donc pas le problème décrit.

6 votes

@MartinLockett Si vous déclenchez la UIPickerView à partir de cette méthode déléguée, cela fonctionne bien.

9voto

Nadeesha Lakmal Points 172

En martinets 3+ :

class MyViewController: UIViewController, UITextFieldDelegate {

   override func viewDidLoad() {
      self.myTextField.delegate     = self
   }

   func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
      if textField == myTextField {
         // code which you want to execute when the user touch myTextField
      }
      return false
   }
}

8voto

Timm Kent Points 1046

Il suffit de placer un UIButton exactement au-dessus de l'ensemble du UITextField sans étiquette de texte, ce qui le rend "invisible". Ce bouton peut recevoir et déléguer des touches à la place du champ de texte et le contenu du champ de texte reste visible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X