[SWIFT] Désactiver "coller" dans un UiTextField

Bonjour,

Je rencontre un petit soucis avec un UiTextField..
J'aimerai désactiver l'option "Coller" lorsqu'on reste appuyer dessus.

J'ai testé différentes méthodes mais aucune ne fonctionne..

J'ai essayé comme ça :

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
     print(action)
     if(action == #selector(UIResponderStandardEditActions.paste(_:))){
          print("paste == false !")
          return false
     }
     return super.canPerformAction(action, withSender: sender)
}

Je passe bien dedans mais je n'ai aucune action qui s'appelle : paste
Du coup, je ne passe jamais dans mon "if"

J'ai changé de méthode et testé celle la :
http://www.oodlestechnologies.com/blogs/Disable-TextFields-actions-in-Swift
Je ne passe jamais dedans, je ne sais pas pourquoi..

Bref.. avez-vous une solution simple pour empêcher le "coller" dans un textfield ? :)

Merci de votre aide ^^

Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Et tu as écrit ce code ou ?

  • Dans ma class (ViewController), là où se trouve mon uiTextField..

  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2018 modifié #4

    Bah non !

    Si tu avais bien lu l'article dont tu as mis le lien, tu aurais vu qu'il faut créer une sous-classe de UITextField, écrire le code là dedans et assigner cette classe à ton UITextField.

    class CustomUITextField : UITextField
    {
      override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
      {
        if action == #selector(UIResponderStandardEditActions.paste(_:))
        {
          return false
        }
    
        return super.canPerformAction(action, withSender: sender)
      }
    }
    
  • Ah alors on s'est mal compris, je croyais que tu parlais du premier exemple..

    Le premier exemple, je l'ai mis dans ma class (ViewController), je passe bien dedans mais je n'ai pas d'action qui s'appelle "paste" .. du coup je passe bien dans canPerformAction mais pas dans mon if

    Ensuite j'ai testé une 2eme méthode, celle du lien, qui elle, ne fonctionne pas du tout.
    Je ne passe pas du tout dans le canPerformAction et j'ai bien créé une sous-classe de UITextfield et lui ai assigné cette class mais sans résultat.
    J'ai donc abandonné la 2eme méthode.

    Du coup, j'en reviens vous pour trouver une solution qui fonctionne ^^

  • Joanna CarterJoanna Carter Membre, Modérateur

    Mon code va bien ici.

    1. Tu crées un nouveau fichier Swift et coller mon code là dedans.
    2. Tu vas dans l'Identity inspector pour ton UITextField dans ton storyboard
    3. Tu changes sa classe de UITextField à CustomUITextField

    Voilà !

  • J'ai recréé un projet pour être sûr et ça ne fonctionne toujours pas..
    Pourtant il n'y a pas grand chose à faire mais je ne passe jamais dans canPerformAction :/

    Une idée ?

    Sinon en utilisant la première méthode, pourquoi je n'ai rien concernant le "paste" ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Est-ce que tu as créé un fichier Swift exprès pour la classe CustomUITextField ?

  • Oui oui :/

  • Joanna CarterJoanna Carter Membre, Modérateur

    Est-ce que tu as changé la classe de ton UITextField dans IB?

  • Oui oui aussi..
    C'est pour ça que je trouve ça bizarre que ça ne fonctionne pas.. y'a pourtant pas grand chose à faire !

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu peux nous montrer un capture d'écran d'IB qui montre le UITextField et sa classe ?

  • Bien sur, voila :)

  • Pourquoi tu veux empêcher les gens de coller un mot de passe ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu as essayé de supprimer l'UITextField, arrêter et redémarrer Xcode et le remplacer ?

  • InsouInsou Membre
    février 2018 modifié #16

    @Pyroh a dit :
    Pourquoi tu veux empêcher les gens de coller un mot de passe ?

    C'est dans le cahier des charges, c'est comme ça ^^

    @Joanna Carter a dit :
    Tu as essayé de supprimer l'UITextField, arrêter et redémarrer Xcode et le remplacer ?

    Ouai, j'en ai même recréer un autre créer autre complètement différent pour le test et toujours pareil, je passe pas dans ma classe perso :/

    Par contre, quand j'utilise la première méthode, avec un override dans ma class principale, je passe bien dedans sauf que je n'ai pas l'action "paste", j'ai plein d'autre action par contre :

    cut:
    copy:
    select:
    selectAll:
    delete:
    _promptForReplace:
    _transliterateChinese:
    _showTextStyleOptions:
    _lookup:
    _define:
    _addShortcut:
    _accessibilitySpeak:
    _accessibilitySpeakLanguageSelection:
    _accessibilityPauseSpeaking:
    _share:
    makeTextWritingDirectionRightToLeft:
    makeTextWritingDirectionLeftToRight:

  • JérémyJérémy Membre
    février 2018 modifié #17

    Normal, tu tombes dans le canPerformAction relatif à ton ViewController.

    Peux tu ajouter une méthode qui attrape l'événement editingChanged dans ta classe CustomUITextField voir si ta classe est bien pris en compte par XIB ? Tu écris quelque chose dans ton textfield et normalement tu devrais pouvoir intercepter l'événement. Ca nous donnera une indication supplémentaire sur le souci que tu rencontres.

  • Bon, j'ai tout recommencer pour la Xème fois et maintenant ça fonctionne, j'arrive à faire ce que je veux..
    Je ne sais pas où je me trompais avant mais là j'ai peur d'y retoucher donc on va dire que c'est réglé ^^

    Merci de votre aide :)

  • Surement XIB qui ne se basait pas sur la bonne classe...

Connectez-vous ou Inscrivez-vous pour répondre.