web-dev-qa-db-fra.com

Comment ajouter le bouton Terminé au clavier?

METTRE À JOUR:

J'ai également essayé d'implémenter un délégué UITextViewDelegate puis de faire dans mon contrôleur:

- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    [textView resignFirstResponder];
    return YES;
}

J'ai également défini le délégué de la vue texte sur self (instance de la vue du contrôleur).

Cliquer sur le bouton Terminé n'insère toujours qu'une nouvelle ligne :(


METTRE À JOUR:

Ce que j'ai fait jusqu'à présent J'ai implémenté un UITextFieldDelegate par mon contrôleur de vue.

J'ai connecté la vue texte au contrôleur de vue via la sortie.

Puis j'ai fait:


self.myTextView.delegate = self;

Et:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Mais lorsque je clique sur le bouton Terminé, il ajoute simplement une nouvelle ligne.

J'ai donc un élément UITextView sur ma scène et lorsqu'un utilisateur appuie dessus, le clavier apparaît et il peut être modifié.

Cependant, je ne peux pas ignorer le clavier.

Comment puis-je ajouter le bouton Terminé sur le clavier afin qu'il puisse être ignoré?

49
Richard Knop

c'est assez simple :)

[textField setReturnKeyType:UIReturnKeyDone];

pour avoir ignoré le clavier, implémentez le protocole <UITextFieldDelegate> dans votre classe,

textfield.delegate = self;

et utilise 

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textField resignFirstResponder];
}

ou

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
115

Allez dans votre story-board, sélectionnez votre champ de texte et sous l'inspecteur d'attributs, une option dit "touche de retour" ... sélectionnez "Terminé".

Ensuite, allez dans votre ViewController et ajoutez:

- (IBAction)dismissKeyboard:(id)sender;
{
    [textField becomeFirstResponder];
    [textField resignFirstResponder];
}

Revenez ensuite à votre champ de texte, cliquez sur les prises et sur le lien "Ne s'est pas terminé à la sortie" pour rejeter l'action Keyboard.

16
Mike Z

Ajouter UIToolBar en tant que vue personnalisée contenant le bouton Terminé en tant que UIBarButtonItem.

C’est un moyen plus sûr et plus propre d’ajouter le bouton Terminé à n’importe quel type de clavier. Créez UIToolBar, ajoutez-y le bouton Done et définissez inputAccessoryView pour tout UITextField ou UITextView.

UIToolbar *ViewForDoneButtonOnKeyboard = [[UIToolbar alloc] init];
[ViewForDoneButtonOnKeyboard sizeToFit];
UIBarButtonItem *btnDoneOnKeyboard = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                               style:UIBarButtonItemStyleBordered target:self
                                                              action:@selector(doneBtnFromKeyboardClicked:)];
[ViewForDoneButtonOnKeyboard setItems:[NSArray arrayWithObjects:btnDoneOnKeyboard, nil]];

myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard;

Bouton IBAction For Done

 - (IBAction)doneBtnFromKeyboardClicked:(id)sender
  {
      NSLog(@"Done Button Clicked.");

      //Hide Keyboard by endEditing or Anything you want.
      [self.view endEditing:YES];
  }

Swift 3

var ViewForDoneButtonOnKeyboard = UIToolbar()
ViewForDoneButtonOnKeyboard.sizeToFit()
var btnDoneOnKeyboard = UIBarButtonItem(title: "Done", style: .bordered, target: self, action: #selector(self.doneBtnFromKeyboardClicked))
ViewForDoneButtonOnKeyboard.items = [btnDoneOnKeyboard]
myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard

Une fonction

  @IBAction func doneBtnFromKeyboardClicked (sender: Any) {
     print("Done Button Clicked.")
    //Hide Keyboard by endEditing or Anything you want.
    self.view.endEditing(true)
  }
13
ViJay Avhad

Version rapide:

Dans votre ViewController:

textField.returnKeyType = UIReturnKeyType.Done
textField.delegate = self

Après votre ViewController

extension MyViewController: UITextFieldDelegate {        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}
10
Esqarrouth

Ok, donc moi aussi je me suis battu avec ce problème. Actuellement, j'accède à une UITextView dans une UITableViewCell (via des balises). Comme j'utilise des cellules prototypes, je ne peux utiliser ni IBActions ni IBOutlets, comme tout le monde le suggère. Au lieu de cela, j'utilise;

- (BOOL) textView: (UITextView *) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString *) text

Cela me fournira ensuite le texte chaque fois que l'utilisateur appuiera sur un bouton. Ma solution était alors d’obtenir le caractère ascii pour la nouvelle ligne; "/ n". Si c'est le texte qui a été saisi, je démissionnerais du premier répondant. Par exemple;

// If the text length is 0 then the user is deleting something, so only check the ascii character if there is text to check
if (text.length != 0) {
    // Get the Ascii character
    int asciiCode = [text characterAtIndex:0];
    // If the ascii code is /n or new line, then resign first responder
    if (asciiCode == 10) {
        [alertTextView resignFirstResponder];
        [DeviceTextView resignFirstResponder];
    }
}

Je ne sais pas si quelqu'un d'autre aura besoin de cette solution, mais je me suis dit que je la mettrais au cas où quelqu'un en aurait besoin!

1
Donato Perconti

Définissez l'option 'Return Key' sous l'option text field dans l'inspecteur pour votre champ de texte . Puis faites un clic droit sur le champ de texte et tout en maintenant CTRL sélectionnez 'Did End On Exit' et faites-le glisser dans votre fichier view controllers. Cela créera une méthode IBAction. Donnez un nom à la méthode, puis entrez les valeurs suivantes:

[textField becomeFirstResponder];
[textField resignFirstResponder];

Votre méthode devrait ressembler à ceci:

- (IBAction)methodName:(id)sender;
{
    [sender becomeFirstResponder];
    [sender resignFirstResponder];
}
1
Garreth Golding

Ce qui suit est mon approche, dans Swift 3. Lorsque la doneBtn a cliqué, laissez-la envoyer l'événement .editingDidEndOnExit. J'utilise cet événement pour gérer un problème de focus entre plusieurs textFields.

// My customized UITextField
class MyTextField: UITextField {

    override func awakeFromNib() {
        super.awakeFromNib()

        // Add toolBar when keyboardType in this set. 
        let set : [UIKeyboardType] = [.numberPad, .phonePad]
        if (set.contains(self.keyboardType) ) {
            self.addDoneToolbar()
        }
    }

    // Add a toolbar with a `Done` button
    func addDoneToolbar() {

        let toolbar = UIToolbar()
        let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(onToolBarDone))

        toolbar.items = [space, doneBtn]
        toolbar.sizeToFit()

        self.inputAccessoryView = toolbar
    }

    @objc func onToolBarDone() {
        // I use `editingDidEndOnExit` to simulate the `Done` behavior 
        // on the original keyboard.
        self.sendActions(for: .editingDidEndOnExit)
    }
}
0
AechoLiu

C’est la meilleure façon d’ajouter Done Button sur le clavier

textField.returnKeyType = UIReturnKeyDone;
0
DURGESH Chaurasiya