2009-12-01 6 views
1

Je développe une application iPhone qui nécessite un champ de texte multiligne (UITextView) pour capturer du texte.UITextView n'a aucun événement

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

Ma prochaine option serait de démissionner du premier répondeur s'il y a une retouche en dehors de la vue de texte. Le problème ici est qu'il n'y a aucun événement déclaré sur UITextView que je peux voir dans le constructeur d'interface.

Comment puis-je créer un champ de texte multiligne dans une application iPhone qui libérera le premier répondeur à un moment opportun lorsque l'utilisateur en aura fini avec lui?

Répondre

3

Vous pouvez utiliser un bouton fait sur la barre de navigation:

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

pour masquer le clavier, gérer l'événement avec quelque chose comme:

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

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

3

Je suppose que vous vous lamentez sur le bouton Done "manquant" sur le clavier qui est de retour sur un UItextView multi lignes, corrigez-moi si je me trompe.

L'approche évidente semble avoir un autre bouton sur votre interface qui démissionne premier répondeur.

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

L'application Apple Notes utilise son bouton en haut à droite pour démissionner du premier répondeur, une approche comme celle-ci semble raisonnable.

0

Si vous avez la clé 'done' sur le clavier, la méthode que j'utilise est de vérifier le dernier caractère de UITextView quand le contenu change. Si le dernier caractère est une nouvelle ligne, l'utilisateur a appuyé sur le bouton Terminé. J'apprécierais le point de vue de Neil selon lequel il devrait y avoir un autre bouton, mais parfois le client obtient ce que le client veut.

De toute évidence, vous devrez définir le délégué pour UITextView pour pointer vers la classe dans laquelle cette méthode réside. 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]; 
} 

}

1
//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]; 

     } 
    } 
0
  • (BOOL) textView: (UITextView *) textView shouldChangeTextInRange: (NSRange) replacementText gamme: (NSString *) {texte

    [txtView resignFirstResponder]; 
    

    retour OUI; }

1

Vous pouvez créer un bouton invisible qui couvre tout l'écran et que d'ajouter une méthode pour elle. Je pense que ça va marcher comme ça.

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