52 votes

Comment insérer un espace réservé dans UITextView ?

Existe-t-il un moyen d'insérer un espace réservé dans un fichier UITextView similaire à la UITextField ? Si oui, envoyez-moi un lien ou une idée pour mettre en œuvre cette fonctionnalité.

0 votes

Pourquoi ne pas utiliser la catégorie UITextView+Placeholder ? github.com/devxoul/UITextView-Placeholder

212voto

PJR Points 6126

Il n'est pas possible de créer un espace réservé dans UITextView, mais vous pouvez générer un effet comme un espace réservé.

- (void)viewDidLoad {   
    commentTxtView.text = @"Comment";
    commentTxtView.textColor = [UIColor lightGrayColor];
    commentTxtView.delegate = self;

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

-(void) textViewDidChange:(UITextView *)textView {

    if(commentTxtView.text.length == 0) {
        commentTxtView.textColor = [UIColor lightGrayColor];
        commentTxtView.text = @"Comment";
        [commentTxtView resignFirstResponder];
    }
}

-(void) textViewShouldEndEditing:(UITextView *)textView {

    if(commentTxtView.text.length == 0) {
        commentTxtView.textColor = [UIColor lightGrayColor];
        commentTxtView.text = @"Comment";
        [commentTxtView resignFirstResponder];
    }
}

OU vous pouvez ajouter une étiquette dans la fenêtre de texte comme suit

lbl = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0,textView.frame.size.width - 10.0, 34.0)];

[lbl setText:kDescriptionPlaceholder];
[lbl setBackgroundColor:[UIColor clearColor]];
[lbl setTextColor:[UIColor lightGrayColor]];
textView.delegate = self;

[textView addSubview:lbl];

et définir

- (void)textViewDidEndEditing:(UITextView *) textView {
    if (![textView hasText]) {
        lbl.hidden = NO;
    }
}

- (void) textViewDidChange:(UITextView *)textView {
    if(![textView hasText]) {
        lbl.hidden = NO;
    }
    else {
        lbl.hidden = YES;
    }  
}

23 votes

C'est joli et simple mais textViewShouldBeginEditing effacera toujours tout le texte - vous pourriez ne pas vouloir cela quand un utilisateur entre du texte, quitte la vue texte, puis revient pour éditer à nouveau... pouf . Il suffirait d'ajouter une vérification de la couleur et de n'effacer que lorsque la couleur est grise.

0 votes

Que se passe-t-il si j'ai plus d'un UITextView ?

0 votes

@Odelya Je n'ai pas rencontré ce problème, mais je pense que vous pouvez le faire en leur passant une balise et en changeant les étiquettes d'affichage et de masquage en fonction de la condition de la balise. comme if (txtview.tag == 1) { votre code}.

18voto

jlajlar Points 341

Une autre solution simple consiste à ajouter un UILabel à votre UITextView vue secondaire.

- (void)viewDidLoad
{
  [super viewDidLoad];

  // you might have to play around a little with numbers in CGRectMake method
  // they work fine with my settings
  placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, textView.frame.size.width - 20.0, 34.0)];
  [placeholderLabel setText:kDescriptionPlaceholder];
  // placeholderLabel is instance variable retained by view controller
  [placeholderLabel setBackgroundColor:[UIColor clearColor]];
  [placeholderLabel setFont:[challengeDescription font]];
  [placeholderLabel setTextColor:[UIColor lightGrayColor]];

  // textView is UITextView object you want add placeholder text to
  [textView addSubview:placeholderLabel];
}

- (void) textViewDidChange:(UITextView *)theTextView
{
  if(![textView hasText]) {
    [textView addSubview:placeholderLabel];
  } else if ([[textView subviews] containsObject:placeholderLabel]) {
    [placeholderLabel removeFromSuperview];
  }
}

- (void)textViewDidEndEditing:(UITextView *)theTextView
{
  if (![textView hasText]) {
    [textView addSubview:placeholderLabel];
  }
}

Vous pouvez même ajouter de petites animations pour faire apparaître ou disparaître en fondu l'image. UILabel si c'est votre truc.

- (void) textViewDidChange:(UITextView *)theTextView
{
  if(![textView hasText]) {
    [textView addSubview:placeholderLabel];
    [UIView animateWithDuration:0.15 animations:^{
      placeholderLabel.alpha = 1.0;
    }];
  } else if ([[textView subviews] containsObject:placeholderLabel]) {

    [UIView animateWithDuration:0.15 animations:^{
      placeholderLabel.alpha = 0.0;
    } completion:^(BOOL finished) {
      [placeholderLabel removeFromSuperview];
    }];
  }
}

- (void)textViewDidEndEditing:(UITextView *)theTextView
{
  if (![textView hasText]) {
    [textView addSubview:placeholderLabel];
    [UIView animateWithDuration:0.15 animations:^{
      placeholderLabel.alpha = 1.0;
    }];
}

1 votes

Cela peut fonctionner, mais c'est contraire aux recommandations explicites d'Apple : "Bien qu'il soit techniquement possible d'ajouter des sous-vues aux contrôles système standard - des objets qui héritent de UIControl - vous ne devez jamais les personnaliser de cette manière." Cette recommandation est tirée de developer.apple.com/library/ios/#documentation/WindowsViews/ dans la section intitulée "Ne pas personnaliser les contrôles en intégrant des vues secondaires"

0 votes

Bien sûr, je suis d'accord. Mais en attendant qu'Apple mette en place cette fonctionnalité, c'est une très bonne solution.

0 votes

@algal Que suggérez-vous ? Est-ce que l'overriding n'est pas drawRect: tout aussi (voire plus) dangereux ?

9voto

MingSoft Points 61

Une autre solution simple consiste à définir OUI/NON pour les propriétés cachées de placeholderLabel.

- (void)textViewDidEndEditing:(UITextView *)theTextView
{
    if (![textView hasText]) {
        placeholderLabel.hidden = NO;
    }
}

- (void) textViewDidChange:(UITextView *)textView
{
    if(![textView hasText]) {
        placeholderLabel.hidden = NO;
    }
    else{
        placeholderLabel.hidden = YES;
    }
}

5voto

swamy Points 31
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
  // NSLog(@"REPlace %@ %d",text,range.location);
  if(range.location==0 && ![text isEqualToString:@""])
  {
    placeholderlbl.hidden = YES;
  }
  else if(range.location==0)
  {
    placeholderlbl.hidden = NO;
  }

  return YES;
}

1voto

sinh99 Points 2275

Vous pouvez utiliser la fonction ci-dessous pour créer un espace réservé, en utilisant cette fonction vous pouvez définir un espace réservé.

[self addTextViewPlaceholder:self.txtvComment withPlaceholder:@"COMMENT"];

-(void) addTextViewPlaceholder:(UITextView*) tView withPlaceholder:(NSString*) placeholder
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(9,8,tView.bounds.size.width - 16,0)];
    label.lineBreakMode = UILineBreakModeWordWrap;
    label.numberOfLines = 0;
    label.font = [UIFont systemFontOfSize:13.0];
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor colorWithRed:0.7 green:0.7 blue:0.7 alpha:1.0];

    label.text = placeholder;
    label.alpha = 1;
    label.tag = 999;
    [tView addSubview:label];
    [label sizeToFit];
    if(![tView.text isEqualToString:@""])
        [label setAlpha:0];
    [label release];
}

Vous pouvez gérer le texte des espaces réservés à l'aide de ce

- (void)textViewDidChange:(UITextView *)textView
{
    [self textChange:textView];
}

- (void)textChange:(UITextView *)textView
{
    if([textView.text length]>0)
        [[textView viewWithTag:999] setAlpha:0];
    else
        [[textView viewWithTag:999] setAlpha:1];
}

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