web-dev-qa-db-fra.com

Entrée utilisateur multiligne dans iOS: UITextField vs UITextView

Je dois montrer aux utilisateurs une "boîte" de saisie de texte multiligne d'une hauteur supérieure à la hauteur standard d'un UITextField. Quelle devrait être la meilleure approche ou la plus correcte?

  1. Utiliser un UITextField et changer sa hauteur dans le code ou en appliquant une contrainte de hauteur.
  2. Utiliser un UITextView éditable. Ceci est multi-ligne mais il n'a pas d'espace réservé par défaut, je suppose que je devrais implémenter cette fonctionnalité dans le code.
34
AppsDev

UITextField est spécifiquement une ligne seulement.

Utilisez UITextView à la place pour le texte multiligne.

Pour implémenter l’espace réservé dans UITextView, utilisez cette logique/code.

Commencez par définir UITextView pour qu'il contienne le texte de substitution et définissez-le sur une couleur gris clair afin de reproduire l'aspect du texte de substitution de UITextField. Faites-le dans le viewDidLoad ou lors de la création de la vue texte.

Pour Swift

textView.text = "Placeholder"
textView.textColor = UIColor.lightGrayColor()

pour Objective-C

textView.text = @"Placeholder";
textView.textColor =[UIColor lightGrayColor];

Ensuite, lorsque l'utilisateur commence à modifier la vue texte, si celle-ci contient un espace réservé (c'est-à-dire si sa couleur de texte est gris clair), effacez le texte de l'espace réservé et définissez la couleur du texte sur noir afin de permettre la saisie de l'utilisateur.

Pour Swift

func textViewDidBeginEditing(textView: UITextView) {
    if textView.textColor == UIColor.lightGrayColor() {
        textView.text = nil
        textView.textColor = UIColor.blackColor()
    }
}

pour Objective-C

- (BOOL) textViewShouldBeginEditing:(UITextView *)textView
{
    if (textView.textColor == [UIColor lightGrayColor]) {
        textView.text = @"";
        textView.textColor = [UIColor blackColor];
    }

    return YES;
} 

Ensuite, lorsque l'utilisateur a fini de modifier la vue de texte et qu'elle est résignée en tant que premier répondeur, si la vue de texte est vide, réinitialisez son espace réservé en rajoutant le texte de l'espace réservé et en définissant sa couleur en gris clair.

Pour Swift

func textViewDidEndEditing(textView: UITextView) {
    if textView.text.isEmpty {
        textView.text = "Placeholder"
        textView.textColor = UIColor.lightGrayColor()
    }
}

pour Objective-C

- (void)textViewDidEndEditing:(UITextView *)textView{
    if ([textView.text isEqualToString:@""]) {
        textView.text = @"Placeholder";
        textView.textColor =[UIColor lightGrayColor];
    }
}

Ajoutez également UITextViewDelegate dans le contrôleur de vue.

79
Deepraj Chowrasia

Allez avec l'option deux, la hauteur de textField ne peut pas être changée et la deuxième ligne n'est pas affichée ...

LOGIQUE PLACEHOLDER:

textView.text = "Placeholder"
textView.textColor = UIColor.lightGrayColor()

func textViewDidBeginEditing(textView: UITextView) {
    if textView.textColor == UIColor.lightGrayColor() {
        textView.text = nil
        textView.textColor = UIColor.blackColor()
    }
}
func textViewDidEndEditing(textView: UITextView) {
    if textView.text.isEmpty {
        textView.text = "Placeholder"
        textView.textColor = UIColor.lightGrayColor()
    }
}

De espace réservé à la vue texte rapide .

9
Mr. Xcoder

Pour Swift

UITextView n'a pas de manière inhérente une propriété de marque de réservation, vous devez donc en créer et en manipuler une par programme à l'aide de méthodes UITextViewDelegate.

(Remarque: Ajoutez UITextViewDelegate à la classe et définissez textView.delegate = self.)

Commencez par définir le UITextView pour qu'il contienne le texte fictif et définissez-le sur une couleur gris clair pour imiter l'aspect du texte fictif d'un UITextField. Faites-le soit dans le viewDidLoad ou lors de la création de la vue texte.

textView.text = "Placeholder"
textView.textColor = UIColor.lightGray

Ensuite, lorsque l'utilisateur commence à modifier la vue texte, si celle-ci contient un espace réservé (c'est-à-dire si sa couleur de texte est gris clair), effacez le texte de l'espace réservé et définissez la couleur du texte sur noir afin de permettre la saisie de l'utilisateur.

func textViewDidBeginEditing(_ textView: UITextView) {
    if textView.textColor == UIColor.lightGray {
        textView.text = nil
        textView.textColor = UIColor.black
    }
}

Ensuite, lorsque l'utilisateur a fini de modifier la vue de texte et qu'elle est résignée en tant que premier répondeur, si la vue de texte est vide, réinitialisez son espace réservé en rajoutant le texte de l'espace réservé et en définissant sa couleur en gris clair.

func textViewDidEndEditing(_ textView: UITextView) {
    if textView.text.isEmpty {
        textView.text = "Placeholder"
        textView.textColor = UIColor.lightGray
    }
}

3
Naveen Kumar M

J'irais certainement avec UITextView. Si vous souhaitez définir un texte de substitution, UITextView+Placeholder permet de le configurer facilement. Vous pouvez l'installer en utilisant

pod 'UITextView+Placeholder', '~> 1.2'

dans votre fichier pod. Maintenant, vous pouvez importer en-tête

#import <UITextView+Placeholder/UITextView+Placeholder.h>

ce qui aide à définir un espace réservé facilement.

UITextView *textView = [[UITextView alloc] init];
textView.placeholder = @"How are you?";
textView.placeholderColor = [UIColor lightGrayColor]; // optional
textView.attributedPlaceholder = ... // NSAttributedString (optional)
1
Rains

Vous ne pouvez pas créer de texte multiligne avec UITextField, vous devriez aller avec UITextView et implémenter la logique d’espace réservé.

1
venky