web-dev-qa-db-fra.com

Désactivation de la saisie de l'utilisateur pour UITextfield dans swift

question assez triviale, je sais. Mais je ne trouve rien en ligne.

Je dois empêcher l'utilisateur de pouvoir modifier le texte à l'intérieur d'un champ de texte. Pour que lorsque le clic sur le texte, un clavier n'apparaisse pas.

Des idées?

Une solution programmatique ou si cela est possible grâce aux storyboards serait génial.

42
Matt Spoon

Essaye ça:

Swift 2.:

textField.userInteractionEnabled = false

Swift 3.:

textField.isUserInteractionEnabled = false

Ou dans le storyboard, décochez la case "Interaction utilisateur activée".

enter image description here

88
Vlad

Une autre solution, déclarez votre contrôleur comme UITextFieldDelegate, implémentez ce rappel:

@IBOutlet weak var myTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    myTextField.delegate = self
}

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    if textField == myTextField {
        return false; //do not show keyboard nor cursor
    }
    return true
}
39
Duyen-Hoa

Dans le storyboard, vous avez deux choix:

  1. définissez le paramètre 'enable' du contrôle sur false.

enter image description here

  1. définir la 'interaction utilisateur' de la vue false

enter image description here

La différence entre ces choix est:

l'apparence de UITextfild à afficher à l'écran.

enter image description here

  1. Le premier est de définir l'activation du contrôle. Vous pouvez voir que la couleur de fond est modifiée.
  2. Deuxièmement, définissez l'option "Activer l'interaction utilisateur" de la vue. La couleur de fond n'est pas changée.

Dans le code:

  1. textfield.enable = false
  2. textfield.userInteractionEnabled = NO

    Mise à jour pour Swift

    1. textField.isEnabled = false
    2. textfield.isUserInteractionEnabled = false
21
dusty

J'aime le faire comme autrefois. Vous utilisez simplement une classe UITextField personnalisée comme celle-ci:

//
//  ReadOnlyTextField.Swift
//  MediFormulas
//
//  Created by Oscar Rodriguez on 6/21/17.
//  Copyright © 2017 Nica Code. All rights reserved.
//

import UIKit

class ReadOnlyTextField: UITextField {

    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

    override init(frame: CGRect) {
        super.init(frame: frame)

        // Avoid keyboard to show up
        self.inputView = UIView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Avoid keyboard to show up
        self.inputView = UIView()
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        // Avoid cut and paste option show up
        if (action == #selector(self.cut(_:))) {
            return false
        } else if (action == #selector(self.paste(_:))) {
            return false
        }

        return super.canPerformAction(action, withSender: sender)
    }

}
2
mld.oscar

vous pouvez utiliser UILabel à la place si vous ne voulez pas que l'utilisateur puisse modifier quoi que ce soit dans votre UITextField

Une solution programmatique consisterait à utiliser la propriété enabled:

yourTextField.enabled = false

Une façon de le faire dans un story-board:

Décochez la case Activé dans les propriétés de votre UITextField

enter image description here

0
Novarg

Vous devez utiliser "isEditable" au lieu de "userInteractionEnabled", car si UITextfield a plus de lignes que celles que vous voyez et qui défile. "UserInteractionEnabled" ne fonctionnera pas pour le défilement.

Swift 4

textView.isEditable = false
0
Tiago Mendes

Swift 4.2/Xcode 10.1:

Décochez simplement le comportement Activé dans votre storyboard -> inspecteur d'attributs.

0
FRIDDAY