Cómo mostrar el botón "Hecho" en el teclado numérico de iPhone

votos
208

No hay un botón Hecho en el teclado numérico. Cuando un usuario termina de ingresar información numérica en un campo de texto, ¿cómo puedo hacer que desaparezca el teclado numérico?

Podría obtener un botón Hecho utilizando el teclado predeterminado, pero los usuarios tendrían que cambiar a las teclas numéricas para ingresar los números. ¿Hay alguna manera de mostrar un botón Listo en el teclado numérico?

Publicado el 25/02/2009 a las 03:45
fuente por usuario
En otros idiomas...                            


21 respuestas

votos
321

Otra solución. Perfecto si hay otros campos de texto almohadilla no el número en la pantalla.

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];
}
Respondida el 08/07/2012 a las 10:26
fuente por usuario

votos
37

Aquí es una adaptación de la respuesta de Luda para Swift:

En la declaración de su UIViewController puesto subclase

let numberToolbar: UIToolbar = UIToolbar()

en viewDidLoad poner:

    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 

y al añadir las funciones de conmoción y alboroto (no dude en elegir otros nombres, basta con cambiar los nombres de selector en consecuencia viewDidLoad

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
Respondida el 24/02/2015 a las 22:24
fuente por usuario

votos
14

El truco que he visto utilizar es crear un botón transparente personalizado del tamaño de toda la vista y luego, en su método de clic, hacer que el campo de texto renuncie a la primera respuesta. Entonces el usuario puede hacer clic en cualquier lugar fuera del campo para cerrar el teclado.

Respondida el 25/02/2009 a las 05:07
fuente por usuario

votos
11

La solución en UIKeyboardTypeNumberPad y desaparecidos tecla de retorno funciona muy bien, pero sólo si no hay otros no numéricos campos de texto en la pantalla de la almohadilla.

Tomé ese código y lo convirtió en un UIViewController que puede simplemente subclase para hacer teclas numéricas funcionan. Usted tendrá que obtener los iconos de funciones del foro.

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

y 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

Disfrutar.

Respondida el 05/08/2010 a las 21:16
fuente por usuario

votos
9

A continuación se muestra una revisión de la respuesta de Luda con los siguientes cambios:

  • la vista accesorio está dimensionado de forma automática a la anchura del bastidor de aplicación

  • la constante de desuso UIBarButtonItemStyleBorderedse evita

  • el botón "Done" se instancia como una UIBarButtonSystemItemDone

Actualmente el botón "Done" se centra en la vista accesorio. Se puede colocar a la izquierda oa la derecha eliminando el espacio en el lado correspondiente.

He omitido un botón "Cancelar", porque el teclado por defecto no tiene tampoco. Si desea un botón "Cancelar", sugiero que se instancia como UIBarButtonSystemItemCancely que se asegure de que no está descartando el valor original en el campo de texto. El comportamiento "Cancelar" implementado en la respuesta de Luda, que sobrescribe el valor con una cadena en blanco, puede que no sea lo que quiere.

- (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];
}

Para obtener más información sobre la construcción de puntos de vista de accesorios, consulte la documentación de Apple en vistas personalizadas para la entrada de datos . Es probable que desee consultar las páginas de referencia en UIToolbar y UIBarButtonItem también.

Respondida el 16/07/2015 a las 10:16
fuente por usuario

votos
6

Una solución mucho más fácil

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

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
Respondida el 04/08/2011 a las 12:01
fuente por usuario

votos
6

Este es el código más reciente. Sólo tiene que incluir import "UIViewController + NumPadReturn.h" en su viewController.

Aquí está el .h

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

@interface UIViewController (NumPadReturn)



@end

Y ellos

#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
Respondida el 04/12/2010 a las 21:57
fuente por usuario

votos
5

Esta publicación del foro describe cómo personalizar el UIKeyboard para agregar su vista personalizada al teclado.

Respondida el 25/02/2009 a las 05:48
fuente por usuario

votos
3

SWIFT 3.0 Un sabor diferente, usando partes de algunas de las respuestas anteriores.

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()
}
Respondida el 11/09/2017 a las 08:41
fuente por usuario

votos
3

A 3 Swift solución utilizando una extensión. Ideal si usted tiene varias numéricos UITextFieldobjetos en su aplicación, ya que da la flexibilidad para decidir, para cada uno UITextField, si desea realizar una acción personalizada cuando Hecho o Cancelar se toca.

introducir descripción de la imagen aquí

//
//  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() }
}

Ejemplo de uso utilizando las acciones predeterminadas:

//
// MyViewController.swift
//

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

Ejemplo de uso utilizando una costumbre Hecho acción:

//
// MyViewController.swift
//

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

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}
Respondida el 19/08/2017 a las 08:40
fuente por usuario

votos
2

He encontrado respuesta de @ user1258240 a ser bastante concisa dado que esto no es tan simple como el establecimiento de una returnKeyTypepropiedad.

Sólo quería aportar mi propia "reutilizable" acercamiento a este:

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)
}
Respondida el 04/11/2016 a las 02:34
fuente por usuario

votos
2

Si tiene varios campos numéricos, puedo sugerir subclases UITextField para crear un NumericTextField que siempre muestra un teclado numérico con un botón hecho. A continuación, sólo tiene que asociar los campos numéricos con esta clase en el Interface Builder y no se necesita ningún código adicional en cualquiera de sus controladores de Vista. El siguiente es Swift 3.0 clase que estoy usando en 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()
    }
}
Respondida el 02/10/2016 a las 10:07
fuente por usuario

votos
2

También podemos hacer que el "usuario tocado en otro lugar" solución aún más simple si le decimos punto de vista de nuestra vista controlador para finalizar la edición:

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

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

... suponiendo que "tocar otras partes descarta el teclado" se desea el comportamiento de los demás campos editables en la vista también.

Respondida el 06/05/2015 a las 23:46
fuente por usuario

votos
2

Si usted sabe de antemano el número de números para entrar (ejemplo un PIN de 4 dígitos) se podría descartar automáticamente después de 4 pulsaciones de teclas, como por mi respuesta a esta pregunta similar:

Número despedir Pad

No hay necesidad de un botón adicional hecho en este caso.

Respondida el 16/05/2013 a las 14:50
fuente por usuario

votos
2

He modificado solución de Bryan a ser un poco más robusto, por lo que sería jugar muy bien con otros tipos de teclados que pudieran aparecer en la misma vista. Es descrito aquí:

Crear un botón en el teclado numérico HECHO iOS UIKeyboard

Que iba a tratar de explicarlo aquí, pero la mayor parte es el código para mirar que no cabrían fácilmente aquí

Respondida el 04/10/2012 a las 08:38
fuente por usuario

votos
2

Esta es la solución más sencilla que he encontrado. He aprendido esto de principio iOS 5 Desarrollo libro.

Suponiendo que el campo de número se llama numberField.

  1. En ViewController, añadir el siguiente método:

    -(IBAction)closeKeyboard:(id)sender;
    
  2. En ViewController.m, agregue el código siguiente:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
  3. Volver a nibpresentar.

  4. Abrir Utilitiessartén.
  5. Abra la Identity inspectorvirtud de Utilitiesla cacerola.
  6. Haga clic en el View(en el archivo de la boca) una vez. Asegúrese de que usted no ha hecho clic en cualquiera de los elementos de la vista. En aras de la claridad, debería ver UIView bajo Classen Identity inspector.
  7. Cambiar la clase de UIView a uicontrol.
  8. Abierta Connection Inspector.
  9. Haga clic y arrastrar Touch Downy soltar la flecha del File Ownericono. (Para su información ... Icono de archivo propietario aparece a la izquierda de Viewy aparece como un cubo hueco con marco de color amarillo).
  10. Seleccionar el método: closeKeyboard.
  11. Ejecuta el programa.

Ahora bien, cuando se hace clic en cualquier lugar en el fondo de View, usted debe ser capaz de ocultar el teclado.

Espero que esto ayude a resolver su problema. :-)

Respondida el 12/09/2012 a las 16:07
fuente por usuario

votos
2

El más simple manera es:

Crear botón personalizado transparente y colocarlo en la esquina izquierda hacia abajo, lo que tendrá misma CGSizecomo espacio vacío en UIKeyboardTypeNumberPad. Toggle (mostrar / ocultar) este botón en textField becomeFirstResponder, el clic de botón, respectivamente.

Respondida el 26/06/2012 a las 12:44
fuente por usuario

votos
2

Describo una solución para iOS 4.2+ aquí pero el botón de despedir a un fundido de entrada después de que aparezca el teclado. No es terrible, pero no es ideal tampoco.

La solución descrita en la pregunta vinculado anteriormente incluye una ilusión más elegante para despedir el botón, donde se desvanecen y verticalmente desplazar el botón para dar la apariencia de que el teclado y el botón están despidiendo juntos.

Respondida el 23/04/2011 a las 22:28
fuente por usuario

votos
1

Para Swift 2,2 utilizo este

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()
}
Respondida el 04/05/2016 a las 05:23
fuente por usuario

votos
0

Swift 2.2 / utilicé la respuesta de Dx_. Sin embargo, quería esta funcionalidad en todos los teclados. Así que en mi clase base pongo el código:

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)
        }
    }
}

A continuación, sólo llamar addDoneButtonForTextFields en self.view.subviews en viewDidLoad (o willDisplayCell si se utiliza una vista de tabla) para añadir el botón Hecho para todos los teclados.

Respondida el 23/08/2016 a las 14:09
fuente por usuario

votos
0

Todos aquellos aplicación sobre la búsqueda de la vista del teclado y añadiendo el botón realizado en la tercera fila (que es la razón por la altura button.y = 163 b / c del teclado es 216) son frágiles porque IOS mantiene cambiar la jerarquía de vistas. Por ejemplo ninguno de los códigos anteriores para trabajar iOS9.

Creo que es más seguro para simplemente encontrar el punto de vista más elevado, por [[[UIApplication sharedApplication] ventanas] LastObject], y sólo tiene que añadir el botón en la esquina izquierda inferior de la misma, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // modo de retrato

Respondida el 07/12/2015 a las 06:36
fuente por usuario

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