ios swift numpad

¿Cómo agregar el botón "Listo" a Numpad en IOS 8 usando Swift?



(9)

Funciona bien con el teclado predeterminado, pero no puedo hacerlo funcionar con el teclado numérico.

¿Algunas ideas?


De acuerdo con la respuesta de Marko Nikolovski

Aquí está la respuesta objetiva-C:

- (void)ViewDidLoad { [self addDoneButtonOnKeyboard]; } - (void)addDoneButtonOnKeyboard { UIToolbar *toolBarbutton = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; toolBarbutton.barStyle = UIBarStyleBlackTranslucent; UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonAction)]; NSMutableArray *items = [[NSMutableArray alloc] init]; [items addObject:barBtnItem]; [items addObject:done]; toolBarbutton.items = items; [toolBarbutton sizeToFit]; self.timeoutTextField.inputAccessoryView = toolBarbutton; } - (void)doneButtonAction { [self.view endEditing:YES]; }


En primer lugar, déjame decirte una cosa que puedes AGREGAR un botón Listo en tu teclado predeterminado. En realidad, hoy acabo de pasar por este problema y lo resolví. Código listo para usar, simplemente coloque esto en su clase .swift. Estoy usando Xcode 7 y estoy probando esto usando iPad Retina (ios 9).

De todos modos, no más hablar aquí es el código.

//Creating an outlet for the textfield @IBOutlet weak var outletTextFieldTime: UITextField! //Adding the protocol of UITextFieldDelegate class ReservationClass: UIViewController, UITextFieldDelegate { func textFieldShouldBeginEditing(textField: UITextField) -> Bool { //Making A toolbar let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/17)) //Setting the style for the toolbar keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent //Making the done button and calling the textFieldShouldReturn native method for hidding the keyboard. let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:")) //Calculating the flexible Space. let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) //Setting the color of the button. item.tintColor = UIColor .yellowColor() //Making an object using the button and space for the toolbar let toolbarButton = [flexSpace,doneButton] //Adding the object for toolbar to the toolbar itself keyboardDoneButtonShow.setItems(toolbarButton, animated: false) //Now adding the complete thing against the desired textfield outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow return true } //Function for hidding the keyboard. func textFieldShouldReturn(textField: UITextField) -> Bool { self.view.endEditing(true) return false } }

Lo que me está dando la solución como ...

Una cosa más que solo quiero decirles es que esta es la solución de trabajo que he usado en mi proyecto reciente. He publicado esto porque no hay una solución de trabajo disponible para este problema. Código de trabajo y explicación según lo prometido.

EDITAR: -

Haciéndolo más profesional ... Si está siguiendo el código anterior, también le dará la solución de trabajo, pero aquí estoy tratando de hacerlo más profesional. Tenga en cuenta el código MOD. Dejé el código no utilizado anterior con cita.

Cambios ..

  1. Crear un objeto de botón individual
  2. Establecerlo en la barra de herramientas
  3. Reducir el tamaño de la barra de herramientas que se creó anteriormente
  4. Posicionar el botón personalizado a la izquierda de la pantalla usando FlexSpace y NegativeSpace.

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool { let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(200,200, self.view.frame.size.width,30)) // self.view.frame.size.height/17 keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent let button: UIButton = UIButton() button.frame = CGRectMake(0, 0, 65, 20) button.setTitle("Done", forState: UIControlState .Normal) button.addTarget(self, action: Selector("textFieldShouldReturn:"), forControlEvents: UIControlEvents .TouchUpInside) button.backgroundColor = UIColor .clearColor() // let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:")) let doneButton: UIBarButtonItem = UIBarButtonItem() doneButton.customView = button let negativeSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) negativeSpace.width = -10.0 let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) //doneButton.tintColor = UIColor .yellowColor() let toolbarButton = [flexSpace,doneButton,negativeSpace] keyboardDoneButtonShow.setItems(toolbarButton, animated: false) outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow return true }

Ahora me está dando lo siguiente ... Además, trate de hacer coincidir las imágenes y encontrar los cambios.

Gracias.

Espero que esto haya ayudado. Perdón por la larga respuesta.


La solución más simple que pude encontrar - funciona con Swift 4.2 - espero que esto ayude :)

extension UITextField { func addDoneButtonOnKeyboard() { let keyboardToolbar = UIToolbar() keyboardToolbar.sizeToFit() let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(resignFirstResponder)) keyboardToolbar.items = [flexibleSpace, doneButton] self.inputAccessoryView = keyboardToolbar } }

Luego puede manejar la acción realizada en el método de delegado textFieldDidEndEditing o simplemente agregar un método personalizado a la extensión y configurarlo en el selector del doneButton .


Puede agregar la barra de herramientas con el botón Listo al teclado. InputAccessoryView propiedad InputAccessoryView del campo de texto se puede usar para establecer esta barra de herramientas.

A continuación se muestra el código que he usado en mi caso

//Add done button to numeric pad keyboard let toolbarDone = UIToolbar.init() toolbarDone.sizeToFit() let barBtnDone = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(VerifyCardViewController.doneButton_Clicked(_:))) toolbarDone.items = [barBtnDone] // You can even add cancel button too txtCardDetails3.inputAccessoryView = toolbarDone


Puedes crear una clase personalizada. Estoy usando Swift 4 :

class UITextFieldWithDoneButton: UITextField { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.addDoneButtonOnKeyboard() } fileprivate func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) let items = [flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() self.inputAccessoryView = doneToolbar } @objc fileprivate func doneButtonAction() { self.resignFirstResponder() } }


Que yo sepa, no puede agregar el botón Listo en la parte del teclado; habría agregado un inputAccessoryView al UITextField o UITextView (si eso es lo que está usando).

Consulte la documentación para más información .

Editar : consulte esta pregunta para ver un ejemplo sobre cómo hacerlo.

Edición 2 : Ejemplo similar en Swift .

Edición 3 : Código de la edición 2, ya que el enlace puede caducar.

override func viewDidLoad() { super.viewDidLoad() //--- add UIToolBar on keyboard and Done button on UIToolBar ---// self.addDoneButtonOnKeyboard() } //--- *** ---// func addDoneButtonOnKeyboard() { var doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 50)) doneToolbar.barStyle = UIBarStyle.BlackTranslucent var flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) var done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("doneButtonAction")) var items = NSMutableArray() items.addObject(flexSpace) items.addObject(done) doneToolbar.items = items doneToolbar.sizeToFit() self.textView.inputAccessoryView = doneToolbar self.textField.inputAccessoryView = doneToolbar } func doneButtonAction() { self.textViewDescription.resignFirstResponder() }

Swift 4.2

func addDoneButtonOnKeyboard(){ let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) let items = [flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() txtMobileNumber.inputAccessoryView = doneToolbar } @objc func doneButtonAction(){ txtMobileNumber.resignFirstResponder() }


Si se supone que su botón Done simplemente cierra el teclado numérico, la versión más simple sería llamar a resignFirstResponder como el selector de esta manera:

UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder))

Este código funciona en iOS9 y Swift 2, lo estoy usando en mi aplicación:

func addDoneButtonOnNumpad(textField: UITextField) { let keypadToolbar: UIToolbar = UIToolbar() // add a done button to the numberpad keypadToolbar.items=[ UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder)), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil) ] keypadToolbar.sizeToFit() // add a toolbar with a done button above the number pad textField.inputAccessoryView = keypadToolbar }


Solución Swift 3 usando @IBInpectable y extensión. Aparecerá un menú desplegable debajo del Inspector de atributos en el Creador de interfaces para cada UITextField en el proyecto.

extension UITextField{ @IBInspectable var doneAccessory: Bool{ get{ return self.doneAccessory } set (hasDone) { if hasDone{ addDoneButtonOnKeyboard() } } } func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) let items = [flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() self.inputAccessoryView = doneToolbar } func doneButtonAction() { self.resignFirstResponder() } }


Una versión Swift-3 ( de la solución de Marko, que funcionó para mí )

( en mi caso, tengo un UITextField identificado como campo de textfield )

func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 50)) doneToolbar.barStyle = UIBarStyle.default let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(ViewController.doneButtonAction)) var items = [UIBarButtonItem]() items.append(flexSpace) items.append(done) doneToolbar.items = items doneToolbar.sizeToFit() self.textfield.inputAccessoryView = doneToolbar } func doneButtonAction() { self.textfield.resignFirstResponder() }