fields ios iphone cocoa-touch uitextfield uikit

fields - Cómo agregar un botón "Hecho" al teclado del teclado numérico en iOS



text field ios 11 (10)

Aún más fácil:

Swift 3.0 y superior :

func addDoneButton() { let keyboardToolbar = UIToolbar() keyboardToolbar.sizeToFit() let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done, target: view, action: #selector(UIView.endEditing(_:))) keyboardToolbar.items = [flexBarButton, doneBarButton] textField.inputAccessoryView = keyboardToolbar }

Swift 2.3 y siguientes :

func addDoneButton() { let keyboardToolbar = UIToolbar() keyboardToolbar.sizeToFit() let flexBarButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil) let doneBarButton = UIBarButtonItem(barButtonSystemItem: .Done, target: view, action: #selector(UIView.endEditing(_:))) keyboardToolbar.items = [flexBarButton, doneBarButton] textField.inputAccessoryView = keyboardToolbar }

Objetivo C :

- (void)addDoneButton { UIToolbar* keyboardToolbar = [[UIToolbar alloc] init]; [keyboardToolbar sizeToFit]; UIBarButtonItem *flexBarButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *doneBarButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.view action:@selector(endEditing:)]; keyboardToolbar.items = @[flexBarButton, doneBarButton]; self.textField.inputAccessoryView = keyboardToolbar; }

EDITAR:

DCKit una biblioteca útil llamada DCKit , que ya tiene la barra de herramientas lista para DCKit :

También tiene muchas otras características geniales.

Por lo tanto, el teclado del teclado numérico no viene con un botón "Hecho" o "Siguiente" de manera predeterminada, así que me gustaría agregar uno. En iOS 6 y abajo, había algunos trucos para agregar un botón al teclado, pero parece que no funcionan en iOS 7.

Primero me suscribo al teclado que muestra la notificación

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

Luego trato de agregar un botón cuando aparece el teclado:

- (void)keyboardWillShow:(NSNotification *)note { // create custom button UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeSystem]; doneButton.frame = CGRectMake(0, 50, 106, 53); doneButton.adjustsImageWhenHighlighted = NO; [doneButton setTitle:@"Done" forState:UIControlStateNormal]; [doneButton addTarget:self action:@selector(dismissKeyboard) 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 view found; add the custom button to it if([[keyboard description] hasPrefix:@"UIKeyboard"] == YES) [keyboard addSubview:doneButton]; } }

Pero el bucle for no se ejecuta porque no encuentra subvistas. ¿Alguna sugerencia? No pude encontrar ninguna solución para iOS7, ¿hay alguna manera diferente en que se supone que debo estar haciendo esto?

Editar: Gracias por todas las sugerencias sobre barras de herramientas, pero prefiero no seguir esa ruta ya que soy bastante pobre en espacio (y es algo feo).


Basándome en las respuestas anteriores con la versión de Swift, ya que tuve que traducirlo:

@IBOutlet weak var numberTextField: UITextField! override func viewDidLoad() { addDoneButtonTo(numberTextField) } // MARK: Done for numberTextField private func addDoneButtonTo(textField: UITextField) { let flexBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) let doneBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "didTapDone:") let keyboardToolbar = UIToolbar() keyboardToolbar.sizeToFit() keyboardToolbar.items = [flexBarButton, doneBarButton] textField.inputAccessoryView = keyboardToolbar } func didTapDone(sender: AnyObject?) { numberTextField.endEditing(true) }


Debes detectar si estás en un teléfono o iPad, ya que el iPad implementa una tecla de retorno en el teclado numérico


El enfoque mucho más seguro es usar un UIToolBar con el botón Done como inputAccessoryView .

Código de muestra :

UIToolbar *keyboardDoneButtonView = [[UIToolbar alloc] init]; [keyboardDoneButtonView sizeToFit]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneClicked:)]; [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]]; txtField.inputAccessoryView = keyboardDoneButtonView;

Su método -doneClicked debería verse así:

- (IBAction)doneClicked:(id)sender { NSLog(@"Done Clicked."); [self.view endEditing:YES]; }

Código de muestra Swift:

let keyboardDoneButtonView = UIToolbar.init() keyboardDoneButtonView.sizeToFit() let doneButton = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: Selector("doneClicked:"))) keyboardDoneButtonView.items = [doneButton] textFieldInput.inputAccessoryView = keyboardDoneButtonView

Su método -doneClicked debería verse así:

func doneClicked(sender: AnyObject) { self.view.endEditing(true) }


Esta es una forma simple de proyectar un botón hecho en iOS7 num-keypad. En el siguiente método delegado de UITextField, agregue una notificación para show de teclado.

-(void)textFieldDidBeginEditing:(UITextField *)textField { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; }

Ahora implementa el método keyboardWillShow como se muestra a continuación. Aquí debemos tener especial cuidado con iOS7.

- (void)keyboardWillShow:(NSNotification *)note { // create custom button UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; doneButton.frame = CGRectMake(0, 163, 106, 53); doneButton.adjustsImageWhenHighlighted = NO; [doneButton setImage:[UIImage imageNamed:@"doneButtonNormal.png"] forState:UIControlStateNormal]; [doneButton setImage:[UIImage imageNamed:@"doneButtonPressed.png"] forState:UIControlStateHighlighted]; [doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { dispatch_async(dispatch_get_main_queue(), ^{ UIView *keyboardView = [[[[[UIApplication sharedApplication] windows] lastObject] subviews] firstObject]; [doneButton setFrame:CGRectMake(0, keyboardView.frame.size.height - 53, 106, 53)]; [keyboardView addSubview:doneButton]; [keyboardView bringSubviewToFront:doneButton]; [UIView animateWithDuration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]-.02 delay:.0 options:[[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue] animations:^{ self.view.frame = CGRectOffset(self.view.frame, 0, 0); } completion:nil]; }); }else { // locate keyboard view dispatch_async(dispatch_get_main_queue(), ^{ UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; UIView* keyboard; for(int i=0; i<[tempWindow.subviews count]; i++) { keyboard = [tempWindow.subviews objectAtIndex:i]; // keyboard view found; add the custom button to it if([[keyboard description] hasPrefix:@"UIKeyboard"] == YES) [keyboard addSubview:doneButton]; } }); } }

Ahora agregue esta macro al encabezado adecuado para detectar el SYSTEM_VERSION

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)



Puedes usar

myTextField.inputAccessoryView = _inputView;

La vista de accesorios de entrada es una vista que aparece siempre sobre el teclado y descarta con [textfield resignFirstResponder]

poner hecho sobre la vista de entrada y ejecutar resignfirst response de los campos de texto.


Solo usa

yourTextField.inputAccessoryView

espero que ayudes


Here hay un ejemplo de cómo mostrar botones con la barra de herramientas con el teclado ...


enter code here 1. register the controller to the notification - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Keyboard events [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } 2. don''t forget to remove the controller from the notification centre -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.view endEditing:YES]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } 3. implement keyboard notification handlers - (void)keyboardWillShow:(NSNotification *)notification { // create custom button UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; doneButton.frame = CGRectMake(0, 107, 106, 53); [doneButton setTitle:@"Done" forState:UIControlStateNormal]; [doneButton addTarget:self action:@selector(doneButton:)forControlEvents:UIControlEventTouchUpInside]; // save the reference to the button in order to use it in keyboardWillHide method self.donekeyBoardBtn = doneButton; // to my mind no need to search for subviews UIWindow *windowContainigKeyboard = [[[UIApplication sharedApplication] windows] lastObject]; [windowContainigKeyboard addSubview:self.donekeyBoardBtn]; self.donekeyBoardBtn.frame = CGRectMake(0., CGRectGetHeight(w.frame) - CGRectGetHeight(self.donekeyBoardBtn.frame), CGRectGetWidth(self.donekeyBoardBtn.frame), CGRectGetHeight(self.donekeyBoardBtn.frame)); } - (void)keyboardWillHide:(NSNotification *)notification { [self.donekeyBoardBtn removeFromSuperview]; } 4. implement done button action - (void)doneButton:(id)sender{ // add needed implementation [self.view endEditing:YES]; }