guidelines font blue ios iphone user-input

font - ios notifications



Cómo mostrar el botón "Hecho" en el teclado numérico del iPhone (21)

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 "Listo" usando el teclado predeterminado, pero luego los usuarios tendrían que cambiar a las teclas numéricas para ingresar números. ¿Hay alguna manera de mostrar un botón "Hecho" en el teclado numérico?


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

  • La vista accesoria se ajusta automáticamente al ancho del marco de la aplicación.

  • se evita la constante UIBarButtonItemStyleBordered desuso

  • el botón "Listo" se UIBarButtonSystemItemDone como un UIBarButtonSystemItemDone

Actualmente el botón "Hecho" está centrado en la vista de accesorios. Puede colocarlo a la izquierda o a la derecha eliminando el espacio en el lado pertinente.

He omitido un botón "Cancelar" porque el teclado predeterminado tampoco tiene uno. Si desea un botón "Cancelar", le sugiero que lo UIBarButtonSystemItemCancel como un UIBarButtonSystemItemCancel y que se asegure de no descartar el valor original en su 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 desea.

- (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 creación de vistas de accesorios, consulte la documentación de Apple sobre vistas personalizadas para la entrada de datos . Es probable que también desee consultar las páginas de referencia en UIToolbar y UIBarButtonItem .


Aquí está el código más reciente. Simplemente incluya #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


Aquí está la solución más simple que he encontrado. Aprendí esto del libro de desarrollo para principiantes de iOS 5.

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

  1. En ViewController , agregue el siguiente método:

    -(IBAction)closeKeyboard:(id)sender;

  2. En ViewController.m , agregue el siguiente código:

    -(IBAction)closeKeyboard:(id)sender { [numberField resignFirstResponder]; }

  3. Volver al archivo de nib .

  4. Abre el Utilities .
  5. Abra el Identity inspector Utilities .
  6. Haga clic en la View (en el archivo de plumilla) una vez. Asegúrese de no haber hecho clic en ninguno de los elementos de la vista. Para mayor claridad, debería ver UIView en Class en el Identity inspector .
  7. Cambia la clase de UIView a UIControl.
  8. Abra el Connection Inspector .
  9. Haga clic y arrastre Touch Down y suelte la flecha en el icono File Owner . (Para su información, el ícono del Propietario del Archivo se muestra a la izquierda de la View y aparece como un cubo hueco con marco amarillo).
  10. Seleccione el método: closeKeyboard .
  11. Ejecuta el programa.

Ahora, cuando hace clic en cualquier parte del fondo de View , debería poder cerrar el teclado.

Espero que esto te ayude a resolver tu problema. :-)


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

En la declaración de su subclase UIViewController poner

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 agregue las funciones hoopla y hoopla (siéntase libre de elegir otros nombres, simplemente cambie los nombres del selector en ViewDidLoad en consecuencia

func boopla () { textField.resignFirstResponder() } func hoopla () { textField.text="" textField.resignFirstResponder() }


El truco que he visto es hacer que un botón transparente personalizado del tamaño de toda la vista y luego en su método de clic, haga que el campo de texto renuncie al primer respondedor. Por lo tanto, el usuario puede hacer clic en cualquier lugar fuera del campo para descartar el teclado.


La forma más sencilla es:

Cree un botón transparente personalizado y colóquelo en la esquina inferior izquierda, que tendrá el mismo CGSize que espacio vacío en UIKeyboardTypeNumberPad . Alternar (mostrar / ocultar) este botón en textField becomeFirstResponder , al hacer clic en el botón respectivamente.


La solución en UIKeyboardTypeNumberPad y la clave de retorno faltante funcionan muy bien, pero solo si no hay otros campos de texto de teclado no numérico en la pantalla.

Tomé ese código y lo convertí en un UIViewController que puedes simplemente subclasificar para que funcionen los pads de números. Deberá obtener los íconos del enlace anterior.

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.


Modifiqué la solución de Bryan para que fuera un poco más robusta, de modo que funcionara bien con otros tipos de teclados que pudieran aparecer en la misma vista. Se describe aquí:

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

Trataré de explicarlo aquí, pero la mayoría es un código para ver que no encajaría fácilmente aquí


Para Swift 2.2 yo uso 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() }


Si conoce de antemano el número de números que se ingresarán (por ejemplo, un PIN de 4 dígitos), podría cerrar automáticamente después de presionar 4 teclas, según mi respuesta a esta pregunta similar:

despues del teclado numérico

No es necesario un botón adicional hecho en este caso.


Si tiene varios campos numéricos, sugiero subclasificar UITextField para crear un NumericTextField que siempre muestra un teclado numérico con un botón hecho. Luego, simplemente asocie sus campos numéricos con esta clase en el Interface Builder y no necesitará ningún código adicional en ninguno de sus Controladores de Vista. La siguiente es la clase Swift 3.0 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() } }


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

Luego simplemente llame addDoneButtonForTextFields en self.view.subviews en viewDidLoad (o willDisplayCell si usa una vista de tabla) para agregar el botón Hecho a todos los teclados.


También podemos hacer que la solución de "usuario tocado en otro lugar" sea aún más sencilla si le decimos a nuestro controlador de vista que finalice 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 }

... asumiendo que "tocar en otra parte descarta el teclado" es el comportamiento deseado para cualquier otro campo editable en la vista también.


Todas las implementaciones sobre la búsqueda de la vista del teclado y la adición del botón hecho en la 3ª fila (es por eso que button.y = 163 b / c la altura del teclado es 216) son frágiles porque iOS sigue cambiando la jerarquía de las vistas. Por ejemplo, ninguno de los códigos anteriores funciona para iOS9.

Creo que es más seguro encontrar la vista superior, mediante [[[UIApplication sharedApplication] windows] lastObject], y simplemente agregar el botón en la esquina inferior izquierda de la misma, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // modo retrato


Una solución Swift 3 usando una extensión. Ideal si tiene varios objetos UITextField numéricos en su aplicación, ya que le da la flexibilidad de decidir, para cada UITextField , si realizar una acción personalizada cuando se UITextField Done o Cancel .

// // 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 usando una acción personalizada hecha :

// // MyViewController.swift // @IBOutlet weak var myNumericTextField: UITextField! { didSet { myNumericTextField?.addDoneCancelToolbar(onDone: (target: self, action: #selector(doneButtonTappedForMyNumericTextField))) } } func doneButtonTappedForMyNumericTextField() { print("Done"); myNumericTextField.resignFirstResponder() }


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


here describo una solución para iOS 4.2+ here pero el botón de desconexión aparece cuando aparece el teclado. No es terrible, pero tampoco ideal.

La solución descrita en la pregunta vinculada anteriormente incluye una ilusión más elegante para descartar el botón, donde el fundido y el desplazamiento vertical del botón proporcionan la apariencia de que el teclado y el botón descienden juntos.



Otra solución. Perfecto si hay otros campos de texto de teclado no numérico en la pantalla.

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


SWIFT 3.0 Un sabor diferente, utilizando partes de algunas 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() }


Encontré que la respuesta de @ user1258240 es bastante concisa dado que esto no es tan simple como establecer una propiedad returnKeyType .

Solo quería contribuir con mi propio enfoque "reutilizable" para esto:

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