Comment afficher le bouton « Terminé » sur pavé numérique iPhone

voix
208

Il n'y a pas de bouton « Done » sur le pavé numérique. Lorsqu'un utilisateur se termine la saisie des informations numérique dans un champ de texte, comment puis-je faire disparaître le pavé numérique?

Je pourrais obtenir un bouton « Terminé » en utilisant le clavier par défaut, mais les utilisateurs devraient passer aux touches numériques pour saisir des chiffres. Y at-il un moyen de montrer un bouton « OK » sur le pavé numérique?

Créé 25/02/2009 à 03:45
source utilisateur
Dans d'autres langues...                            


21 réponses

voix
321

Une autre solution. Parfait s'il y a d'autres champs de texte pad non-numéro sur l'écran.

inputAccessoryView

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    numberToolbar.barStyle = UIBarStyleBlackTranslucent;
    numberToolbar.items = @[[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
                         [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                         [[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)]];
    [numberToolbar sizeToFit];
    numberTextField.inputAccessoryView = numberToolbar;
}

-(void)cancelNumberPad{
    [numberTextField resignFirstResponder];
    numberTextField.text = @"";
}

-(void)doneWithNumberPad{
    NSString *numberFromTheKeyboard = numberTextField.text;
    [numberTextField resignFirstResponder];
}
Créé 08/07/2012 à 10:26
source utilisateur

voix
37

Voici une adaptation pour la réponse de Luda pour Swift:

Dans la déclaration de votre sous-classe de mettre UIViewController

let numberToolbar: UIToolbar = UIToolbar()

en viewDidLoad mettre:

    numberToolbar.barStyle = UIBarStyle.BlackTranslucent
    numberToolbar.items=[
        UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Bordered, target: self, action: "hoopla"),
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Apply", style: UIBarButtonItemStyle.Bordered, target: self, action: "boopla")
    ]

    numberToolbar.sizeToFit()

    textField.inputAccessoryView = numberToolbar //do it for every relevant textfield if there are more than one 

et ajouter les fonctions et tralala tralala (ne hésitez pas à choisir d'autres noms, il suffit de changer les noms de sélection en conséquence viewDidLoad

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
Créé 24/02/2015 à 22:24
source utilisateur

voix
14

Le truc que je l'ai vu utilisé est de faire un bouton personnalisé transparent la taille de la vue entière et dans sa méthode clic, avoir sa démission premier intervenant le champ de texte. Ainsi, l'utilisateur peut cliquer n'importe où en dehors du champ de rejeter le clavier.

Créé 25/02/2009 à 05:07
source utilisateur

voix
11

La solution dans UIKeyboardTypeNumberPad et la clé de retour manquant fonctionne très bien , mais seulement s'il n'y a pas d' autres champs de texte de tampon non-numéro sur l'écran.

Je pris ce code et l'a transformé en un UIViewController que vous pouvez simplement sous-classe pour faire des blocs numériques fonctionnent. Vous aurez besoin d'obtenir les icônes à partir du lien ci-dessus.

NumberPadViewController.h:

#import <UIKit/UIKit.h>

@interface NumberPadViewController : UIViewController {
    UIImage *numberPadDoneImageNormal;
    UIImage *numberPadDoneImageHighlighted;
    UIButton *numberPadDoneButton;
}

@property (nonatomic, retain) UIImage *numberPadDoneImageNormal;
@property (nonatomic, retain) UIImage *numberPadDoneImageHighlighted;
@property (nonatomic, retain) UIButton *numberPadDoneButton;

- (IBAction)numberPadDoneButton:(id)sender;

@end

et NumberPadViewController.m:

#import "NumberPadViewController.h"

@implementation NumberPadViewController

@synthesize numberPadDoneImageNormal;
@synthesize numberPadDoneImageHighlighted;
@synthesize numberPadDoneButton;

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    if ([super initWithNibName:nibName bundle:nibBundle] == nil)
        return nil;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
        self.numberPadDoneImageNormal = [UIImage imageNamed:@"DoneUp3.png"];
        self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"DoneDown3.png"];
    } else {        
        self.numberPadDoneImageNormal = [UIImage imageNamed:@"DoneUp.png"];
        self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"DoneDown.png"];
    }        
    return self;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // Add listener for keyboard display events
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                    selector:@selector(keyboardDidShow:) 
                                                     name:UIKeyboardDidShowNotification 
                                                   object:nil];     
    } else {
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(keyboardWillShow:) 
                                                     name:UIKeyboardWillShowNotification 
                                                   object:nil];
    }

    // Add listener for all text fields starting to be edited
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(textFieldDidBeginEditing:)
                                                 name:UITextFieldTextDidBeginEditingNotification 
                                               object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
        [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                        name:UIKeyboardDidShowNotification 
                                                      object:nil];      
    } else {
        [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                        name:UIKeyboardWillShowNotification 
                                                      object:nil];
    }
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                    name:UITextFieldTextDidBeginEditingNotification 
                                                  object:nil];
    [super viewWillDisappear:animated];
}

- (UIView *)findFirstResponderUnder:(UIView *)root {
    if (root.isFirstResponder)
        return root;    
    for (UIView *subView in root.subviews) {
        UIView *firstResponder = [self findFirstResponderUnder:subView];        
        if (firstResponder != nil)
            return firstResponder;
    }
    return nil;
}

- (UITextField *)findFirstResponderTextField {
    UIResponder *firstResponder = [self findFirstResponderUnder:[self.view window]];
    if (![firstResponder isKindOfClass:[UITextField class]])
        return nil;
    return (UITextField *)firstResponder;
}

- (void)updateKeyboardButtonFor:(UITextField *)textField {

    // Remove any previous button
    [self.numberPadDoneButton removeFromSuperview];
    self.numberPadDoneButton = nil;

    // Does the text field use a number pad?
    if (textField.keyboardType != UIKeyboardTypeNumberPad)
        return;

    // If there's no keyboard yet, don't do anything
    if ([[[UIApplication sharedApplication] windows] count] < 2)
        return;
    UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];

    // Create new custom button
    self.numberPadDoneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    self.numberPadDoneButton.frame = CGRectMake(0, 163, 106, 53);
    self.numberPadDoneButton.adjustsImageWhenHighlighted = FALSE;
    [self.numberPadDoneButton setImage:self.numberPadDoneImageNormal forState:UIControlStateNormal];
    [self.numberPadDoneButton setImage:self.numberPadDoneImageHighlighted forState:UIControlStateHighlighted];
    [self.numberPadDoneButton addTarget:self action:@selector(numberPadDoneButton:) forControlEvents:UIControlEventTouchUpInside];

    // Locate keyboard view and add button
    NSString *keyboardPrefix = [[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2 ? @"<UIPeripheralHost" : @"<UIKeyboard";
    for (UIView *subView in keyboardWindow.subviews) {
        if ([[subView description] hasPrefix:keyboardPrefix]) {
            [subView addSubview:self.numberPadDoneButton];
            [self.numberPadDoneButton addTarget:self action:@selector(numberPadDoneButton:) forControlEvents:UIControlEventTouchUpInside];
            break;
        }
    }
}

- (void)textFieldDidBeginEditing:(NSNotification *)note {
    [self updateKeyboardButtonFor:[note object]];
}

- (void)keyboardWillShow:(NSNotification *)note {
    [self updateKeyboardButtonFor:[self findFirstResponderTextField]];
}

- (void)keyboardDidShow:(NSNotification *)note {
    [self updateKeyboardButtonFor:[self findFirstResponderTextField]];
}

- (IBAction)numberPadDoneButton:(id)sender {
    UITextField *textField = [self findFirstResponderTextField];
    [textField resignFirstResponder];
}

- (void)dealloc {
    [numberPadDoneImageNormal release];
    [numberPadDoneImageHighlighted release];
    [numberPadDoneButton release];
    [super dealloc];
}

@end

Prendre plaisir.

Créé 05/08/2010 à 21:16
source utilisateur

voix
9

Voici une refonte de la réponse de Luda avec les modifications suivantes:

  • le point de vue auxiliaire est automatiquement dimensionnée pour la largeur du cadre de l'application

  • la constante obsolète UIBarButtonItemStyleBorderedest évitée

  • le bouton « Terminé » est instancié comme UIBarButtonSystemItemDone

Actuellement, le bouton « Terminé » est centré dans la vue accessoire. Vous pouvez le positionner à gauche ou à droite en supprimant l'espace sur le côté pertinent.

J'ai omis un bouton « Annuler » parce que le clavier par défaut n'a pas non plus . Si vous voulez un bouton « Annuler », je suggère que vous instanciez comme UIBarButtonSystemItemCancelet que vous assurez- vous que vous n'êtes pas jeter la valeur d' origine dans votre champ de texte. Le « Annuler » le comportement mis en œuvre dans la réponse de Luda, qui remplace la valeur avec une chaîne vide, peut ne pas être ce que vous voulez.

- (void)viewDidLoad {
  [super viewDidLoad];
  float appWidth = CGRectGetWidth([UIScreen mainScreen].applicationFrame);
  UIToolbar *accessoryView = [[UIToolbar alloc]
                              initWithFrame:CGRectMake(0, 0, appWidth, 0.1 * appWidth)];
  UIBarButtonItem *space = [[UIBarButtonItem alloc]
                            initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                            target:nil
                            action:nil];
  UIBarButtonItem *done = [[UIBarButtonItem alloc]
                           initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                           target:self
                           action:@selector(selectDoneButton)];
  accessoryView.items = @[space, done, space];
  self.valueField.inputAccessoryView = accessoryView;
}

- (void)selectDoneButton {
  [self.valueField resignFirstResponder];
}

Pour plus d' informations sur la construction de vues accessoires, consultez la documentation Apple sur des vues personnalisées pour la saisie de données . Vous voudrez probablement consulter les pages de référence sur UIToolbar et UIBarButtonItem ainsi.

Créé 16/07/2015 à 10:16
source utilisateur

voix
6

Une solution beaucoup plus facile

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event];

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
Créé 04/08/2011 à 12:01
source utilisateur

voix
6

Voici le code le plus récent. Il suffit comprennent #import "UIViewController + NumPadReturn.h" dans votre viewController.

Voici le .h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface UIViewController (NumPadReturn)



@end

Et eux

#import "UIViewController+NumPadReturn.h"


@implementation UIViewController (NumPadReturn)

-(void) viewDidLoad{
    // add observer for the respective notifications (depending on the os version)
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(keyboardDidShow:) 
                                                     name:UIKeyboardDidShowNotification 
                                                   object:nil];     
    } else {
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(keyboardWillShow:) 
                                                     name:UIKeyboardWillShowNotification 
                                                   object:nil];
    }

}


- (void)keyboardWillShow:(NSNotification *)note {
    // if clause is just an additional precaution, you could also dismiss it
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 3.2) {
        [self addButtonToKeyboard];
    }
}

- (void)keyboardDidShow:(NSNotification *)note {
    // if clause is just an additional precaution, you could also dismiss it
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
        [self addButtonToKeyboard];
    }
}

- (void)addButtonToKeyboard {
    // create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 163, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
        [doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
        [doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
    } else {        
        [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
        [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
    }
    [doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];
    // locate keyboard view
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard found, add the button
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
            if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
                [keyboard addSubview:doneButton];
        } else {
            if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
                [keyboard addSubview:doneButton];
        }
    }
}

- (void)doneButton:(id)sender {
    NSLog(@"doneButton");
    [self.view endEditing:TRUE];
}



@end
Créé 04/12/2010 à 21:57
source utilisateur

voix
5

Ce forum post décrit comment personnaliser le UIKeyboard pour ajouter votre vue personnalisée sur le clavier.

Créé 25/02/2009 à 05:48
source utilisateur

voix
3

SWIFT 3.0 Une saveur différente, en utilisant des pièces de quelques réponses précédentes.

func addToolbarToNumberPad()
{
    let numberPadToolbar: UIToolbar = UIToolbar()

    numberPadToolbar.isTranslucent = true
    numberPadToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelAction)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Custom", style: .done, target: self, action: #selector(self.customAction)),
        UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.doneAction)),
    ]

    numberPadToolbar.sizeToFit()

    textField.inputAccessoryView = numberPadToolbar
}

func cancelAction()
{
    textField.resignFirstResponder()
}

func customAction()
{
    textField.resignFirstResponder()
}

func doneAction()
{
    textField.resignFirstResponder()
}

override func viewDidLoad()
{
    super.viewDidLoad()

    self.addToolbarToNumberPad()
}
Créé 11/09/2017 à 11:41
source utilisateur

voix
3

A Swift 3 solution à l' aide d' une extension. Idéal si vous avez plusieurs numériques des UITextFieldobjets dans votre application , car il donne la possibilité de décider, pour chaque UITextField, que ce soit pour effectuer une action personnalisée lorsque Terminé ou Annuler est exploité.

entrez la description d'image ici

//
//  UITextField+DoneCancelToolbar.swift
//

import UIKit

extension UITextField {
    func addDoneCancelToolbar(onDone: (target: Any, action: Selector)? = nil, onCancel: (target: Any, action: Selector)? = nil) {     
        let onCancel = onCancel ?? (target: self, action: #selector(cancelButtonTapped))
        let onDone = onDone ?? (target: self, action: #selector(doneButtonTapped))

        let toolbar: UIToolbar = UIToolbar()
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(title: "Cancel", style: .plain, target: onCancel.target, action: onCancel.action),
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: onDone.target, action: onDone.action)
        ]
        toolbar.sizeToFit()

        self.inputAccessoryView = toolbar
    }

    // Default actions:  
    func doneButtonTapped() { self.resignFirstResponder() }
    func cancelButtonTapped() { self.resignFirstResponder() }
}

Exemple d'utilisation en utilisant les actions par défaut:

//
// MyViewController.swift
//

@IBOutlet weak var myNumericTextField: UITextField! {
    didSet { myNumericTextField?.addDoneCancelToolbar() }
}

Exemple d'utilisation en utilisant une mesure Fait l' action:

//
// MyViewController.swift
//

@IBOutlet weak var myNumericTextField: UITextField! {
    didSet { 
        myNumericTextField?.addDoneCancelToolbar(onDone: (target: self, action: #selector(doneButtonTappedForMyNumericTextField))) 
    }
}

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}
Créé 19/08/2017 à 11:40
source utilisateur

voix
2

J'ai trouvé la réponse de @ user1258240 être assez concis étant donné ce n'est pas aussi simple que la fixation d' un returnKeyTypeimmeuble.

Je voulais juste apporter ma propre approche « réutilisable » à ceci:

func SetDoneToolbar(field:UITextField) {
    let doneToolbar:UIToolbar = UIToolbar()

    doneToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.dismissKeyboard))
    ]

    doneToolbar.sizeToFit()
    field.inputAccessoryView = doneToolbar
}

override func viewDidLoad() {
    super.viewDidLoad()

    SetDoneToolbar(field: UITextField_1)
    SetDoneToolbar(field: UITextField_2)
    SetDoneToolbar(field: UITextField_3)
    SetDoneToolbar(field: UITextField_N)
}
Créé 04/11/2016 à 05:34
source utilisateur

voix
2

Si vous avez plusieurs champs numériques, je suggère subclassing UITextField pour créer une NumericTextField qui affiche toujours un clavier numérique avec un bouton fait. Ensuite, associer simplement vos champs numériques avec cette classe dans l'Interface Builder et vous ne aurez pas besoin de code supplémentaire dans l'un de vos contrôleurs de vue. Ce qui suit est Swift classe 3.0 que j'utilise dans Xcode 8.0.

class NumericTextField: UITextField {
   let numericKbdToolbar = UIToolbar()

    // MARK: Initilization
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initialize()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initialize()
    }

    // Sets up the input accessory view with a Done button that closes the keyboard
    func initialize()
    {
        self.keyboardType = UIKeyboardType.numberPad

        numericKbdToolbar.barStyle = UIBarStyle.default
        let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        let callback = #selector(NumericTextField.finishedEditing)
        let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: callback)
        numericKbdToolbar.setItems([space, donebutton], animated: false)
        numericKbdToolbar.sizeToFit()
        self.inputAccessoryView = numericKbdToolbar
    }

    // MARK: On Finished Editing Function
    func finishedEditing()
    {
        self.resignFirstResponder()
    }
}
Créé 02/10/2016 à 13:07
source utilisateur

voix
2

Nous pouvons également faire le « utilisateur touché un autre » solution encore plus simple si nous disons simplement le point de vue de notre contrôleur de vue de mettre fin à l' édition:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 { 
      [super touchesBegan:touches withEvent:event];

      [self.view endEditing:YES]; //YES ignores any textfield refusal to resign
 }

... en supposant que « toucher le clavier congédie ailleurs » est le comportement souhaité pour tous les autres champs modifiables sur le point de vue aussi bien.

Créé 06/05/2015 à 23:46
source utilisateur

voix
2

Si vous connaissez à l'avance le nombre de numéros à saisir (par exemple un code PIN à 4 chiffres), vous pouvez automatiquement rejeter après 4 touches, selon ma réponse à cette question similaire:

rejetant Ergonomique

Pas besoin d'un bouton supplémentaire fait dans ce cas.

Créé 16/05/2013 à 14:50
source utilisateur

voix
2

J'ai modifié la solution de Bryan être un peu plus robuste, de sorte qu'il jouait bien avec d'autres types de claviers qui pourraient apparaître dans la même vue. Il est décrit ici:

Créer un bouton fait sur l'iOS UIKeyboard numpad

Je vais essayer de l'expliquer ici, mais la plupart est le code de regarder qui ne rentre pas facilement ici

Créé 04/10/2012 à 08:38
source utilisateur

voix
2

Voici la solution la plus simple que je suis venu à travers. Je l'ai appris depuis le début iOS 5 livre de développement.

En supposant que le champ numéro est appelé numberField.

  1. Dans ViewController, ajoutez la méthode suivante:

    -(IBAction)closeKeyboard:(id)sender;
    
  2. Dans ViewController.m, ajoutez le code suivant:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
  3. Retour à un nibfichier.

  4. Ouvrir Utilitiescasserole.
  5. Ouvrez le Identity inspectorsous Utilitiescasserole.
  6. Cliquez sur le View(dans le fichier NIB) une fois. Assurez - vous que vous ne l' avez pas cliqué sur l' un des éléments de la vue. Par souci de clarification, vous devriez voir UIView sous Classdans Identity inspector.
  7. Modifier la classe de UIView à UIControl.
  8. Ouvrir Connection Inspector.
  9. Cliquez et faites glisser Touch Downet déposer la flèche sur l' File Ownericône. ( Pour votre information ... icône Fichier du propriétaire est affiché à gauche de Viewet apparaît comme un cube creux avec cadre jaune.)
  10. Sélectionnez la méthode: closeKeyboard.
  11. Exécutez le programme.

Maintenant , lorsque vous cliquez sur fond de partout View, vous devriez être en mesure de rejeter le clavier.

Espérons que cela vous aide à résoudre votre problème. :-)

Créé 12/09/2012 à 16:07
source utilisateur

voix
2

La plus simple façon est:

Créer bouton personnalisé transparent et placez - le dans le coin gauche vers le bas, ce qui aura même CGSizeque l' espace vide UIKeyboardTypeNumberPad. Bascule (afficher / masquer) ce bouton textField becomeFirstResponder, sur le bouton , cliquez respectivement.

Créé 26/06/2012 à 12:44
source utilisateur

voix
2

Je décris une solution pour iOS 4.2+ ici , mais le bouton rejeter FADES après le clavier apparaît. Ce n'est pas terrible, mais pas non plus idéal.

La solution décrite dans la question liée ci-dessus comprend une illusion plus élégante de rejeter le bouton, où j'Affaiblissement et déplacer verticalement le bouton pour donner l'impression que le clavier et le bouton licencient ensemble.

Créé 23/04/2011 à 22:28
source utilisateur

voix
1

Swift 2.2 J'utilise cette

func addDoneButtonOnKeyboard() {
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))

    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(DetailViewController.finishDecimalKeypad))

    var items: [UIBarButtonItem]? = [UIBarButtonItem]()
    items?.append(flexSpace)
    items?.append(done)

    doneToolbar.items = items
    doneToolbar.sizeToFit()
    self.productPrice.inputAccessoryView=doneToolbar
}

func finishDecimalKeypad() {
    self.productPrice?.resignFirstResponder()
}
Créé 04/05/2016 à 08:23
source utilisateur

voix
0

Swift 2.2 / J'ai utilisé la réponse de Dx_. Cependant, je voulais cette fonctionnalité sur tous les claviers. Donc, dans ma classe de base que je mets le code:

func addDoneButtonForTextFields(views: [UIView]) {
    for view in views {
        if let textField = view as? UITextField {
            let doneToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))

            let flexSpace = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
            let done = UIBarButtonItem(title: "Done", style: .Done, target: self, action: #selector(dismissKeyboard))

            var items = [UIBarButtonItem]()
            items.append(flexSpace)
            items.append(done)

            doneToolbar.items = items
            doneToolbar.sizeToFit()

            textField.inputAccessoryView = doneToolbar
        } else {
            addDoneButtonForTextFields(view.subviews)
        }
    }
}

func dismissKeyboard() {
    dismissKeyboardForTextFields(self.view.subviews)
}

func dismissKeyboardForTextFields(views: [UIView]) {
    for view in views {
        if let textField = view as? UITextField {
            textField.resignFirstResponder()
        } else {
            dismissKeyboardForTextFields(view.subviews)
        }
    }
}

Ensuite, il suffit d'appeler addDoneButtonForTextFields sur self.view.subviews dans viewDidLoad (ou willDisplayCell si vous utilisez une vue de table) pour ajouter le bouton Terminé à tous les claviers.

Créé 23/08/2016 à 17:09
source utilisateur

voix
0

Tous ceux qui la mise en œuvre de trouver le point de vue du clavier et en ajoutant le bouton fait à la 3e rangée (c'est pourquoi button.y = 163 b / c la hauteur du clavier est 216) sont fragiles parce que iOS conserve changer la hiérarchie de la vue. Par exemple aucun des codes ci-dessus pour travailler iOS9.

Je pense qu'il est plus sûr de trouver le point de vue le plus élevé, par [[[UIApplication sharedApplication] fenêtres] LastObject], et il suffit d'ajouter le bouton dans le coin en bas à gauche de celui-ci, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // mode portrait

Créé 07/12/2015 à 09:36
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more