¿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 ..
- Crear un objeto de botón individual
- Establecerlo en la barra de herramientas
- Reducir el tamaño de la barra de herramientas que se creó anteriormente
-
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()
}