Question

Je développe une application iPhone qui requiert un champ de texte multiligne (UITextView) pour capturer du texte.

Lorsque l'utilisateur touche à l'intérieur du textView, il devient le premier répondeur et affiche le clavier. Ce dont j'ai vraiment besoin, c'est de retirer le clavier lorsque l'utilisateur a terminé. Normalement, avec un champ de texte, appuyer sur la touche retour / terminé signalerait la fin de la frappe et j'utiliserais le délégué pour démissionner du premier répondant. Cependant, avec une vue texte multiligne, je souhaite que l’utilisateur puisse ajouter une nouvelle ligne, ce qui n’est pas possible.

Mon option suivante serait de démissionner du premier répondant s'il y a une retouche en dehors de la vue texte. Le problème ici est qu’il n’existe aucun événement déclaré sur UITextView que je puisse voir dans le générateur d’interface.

Comment créer un champ de texte multiligne dans une application iPhone qui publiera le premier répondant à un moment opportun lorsque l'utilisateur en aura terminé?

Était-ce utile?

La solution

Vous pouvez utiliser le bouton TERMINÉ de la barre de navigation:

- (void)viewDidLoad {
      [super viewDidLoad];
  self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)];
}

pour fermer le clavier, gérez l'événement avec quelque chose comme:

- (void) doneAction: (id) sender{ [textView resignFirstResponder]; }

(rappelez-vous les déclarations de fichier .h)

Autres conseils

Je suppose que vous vous lamentez de la mention "manquant". Terminé le bouton du clavier qui revient sur une UItextView multiligne, corrigez-moi si je me trompe.

L’approche évidente semble avoir un autre bouton sur votre interface qui démissionne le premier répondant.

Je ne pense pas qu'un code intelligent qui cache le clavier après un événement serait très intuitif à utiliser.

L'application Apple Notes utilise son bouton situé en haut à droite pour renoncer au premier intervenant. Une approche de ce type semble judicieuse.

//If user touches outside of the keypad, then the keypad will go away
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [[event allTouches] anyObject];
        if (touch.tapCount >= 1) {
            [ZLabel resignFirstResponder];

        }
  }

Vous pouvez créer un bouton invisible couvrant tout l’écran et y ajouter une méthode. Je pense que ça va marcher.

- (IBAction)backgroundClick:(id)sender{
    [textView resignFirstResponder];
}

Si vous êtes complètement prêt à avoir la touche "Terminé" sur le clavier, la méthode que j'utilise consiste à vérifier le dernier caractère de la vue UITextView lorsque le contenu change. Si le dernier caractère est une nouvelle ligne, l'utilisateur a appuyé sur le bouton Terminé. J'appuierais l'opinion de Neil selon laquelle il devrait y avoir un autre bouton, mais parfois le client obtient ce qu'il veut.

Évidemment, vous devrez configurer le délégué de UITextView pour qu'il pointe vers la classe dans laquelle cette méthode habite. La méthode - (void) textViewDidChange: (UITextView *) inTextView fait partie du protocole UITextViewDelegate.

- (void)textViewDidChange:(UITextView *)inTextView {
NSString *text = inTextView.text;

if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') {
    message = [text substringToIndex:[text length] -1];
    [delegate messageEdited];
    [self removeFromSuperview];
}

}

  • (BOOL) textView: (UITextView *) textView devraitChangeTextInRange: (NSRange) range replacementText: (NSString *) text {

    [txtView resignFirstResponder];
    

    retourne OUI; }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top