web-dev-qa-db-fra.com

Comment ajouter une touche de retour sur un pavé décimal dans Swift?

J'ai la configuration du pavé décimal dans mon application, mais comment puis-je ignorer ce clavier? Comment obtenir une clé terminée ou une touche de retour? J'ai essayé UIReturnKeyType.Done mais cela ne montrait rien.

Something like this

Quelque chose comme ca

18
Amit Kalra

Voici une solution Swift 3 utilisant une extension. Idéal si vous avez plusieurs objets numériques UITextField dans votre application car cela donne la flexibilité de décider, pour chaque UITextField, si vous souhaitez effectuer une action personnalisée lorsque Terminé ou Annuler est tapé.

enter image description here

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

Exemple d'utilisation à l'aide des actions par défaut:

//
// MyViewController.Swift
//

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

Exemple d'utilisation à l'aide d'une action personnalisée Terminé:

//
// MyViewController.Swift
//

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

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}
41
olito

Cette solution a fonctionné pour moi =)

Source: https://Gist.github.com/jplazcano87/8b5d3bc89c3578e45c3e

J'ai fait une extension pour UITextField et maintenant je peux avoir une "Done Bar" sur tous les claviers que je veux.

extension UITextField{

 func addDoneButtonToKeyboard(myAction:Selector?){
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 300, height: 40))
    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: myAction)

    var items = [UIBarButtonItem]()
    items.append(flexSpace)
    items.append(done)

    doneToolbar.items = items
    doneToolbar.sizeToFit()

    self.inputAccessoryView = doneToolbar
 }
}

MyViewController

class myViewController:UIViewController,UITextFieldDelegate{

  //MARK: - Outlets
  @IBOutlet weak var myTextField: UITextField!

  //MARK: - Life Cycle
  override func viewDidLoad() {
      super.viewDidLoad()
      myTextField.delegate = self

     //You can specify your own selector to be send in "myAction"
     myTextField.addDoneButtonToKeyboard(myAction:  #selector(self.myTextField.resignFirstResponder))
  }
}

This is the result

19
Karen Gonzalez
class ViewController: UIViewController {

    let textField = UITextField(frame: CGRect(x: 0, y: 20, width: 200, height: 60))

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.borderStyle = .Line
        textField.inputAccessoryView = accessoryView()
        textField.inputAccessoryView?.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 44)
        view.addSubview(textField)
    }

    func accessoryView() -> UIView {

        let view = UIView()
        view.backgroundColor = UIColor.redColor()

        let doneButton = UIButton()
        doneButton.frame = CGRect(x: self.view.frame.width - 80, y: 7, width: 60, height: 30)
        doneButton.backgroundColor = UIColor.greenColor()
        doneButton.setTitle("done", forState: .Normal)
        doneButton.addTarget(self, action: #selector(ViewController.doneAction), forControlEvents: .TouchUpInside)
        view.addSubview(doneButton)

        return view

    }

    @objc func doneAction() {
        textField.resignFirstResponder()
    }
}

enter image description here

1
maquannene

Met à jour la réponse @olito pour Swift 4.2 Pour Swift 4 doit être la méthode objc, nous devons donc ajouter @ objc à nos fonctions à l'intérieur extension

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:
@objc func doneButtonTapped() { self.resignFirstResponder() }
@objc func cancelButtonTapped() { self.resignFirstResponder() }}

(Assurez-vous de connecter IBOutlet)

    @IBOutlet weak var vehicleModelTF: UITextField!

Dans viewDidLoad, nous pouvons ajouter une barre d'outils au champ de texte.

 myTextField.addDoneCancelToolbar(onDone: (target: self, action: #selector(self.tapDone)), onCancel: (target: self, action: #selector(self.tapCancel)))

Maintenant, nous devons ajouter 2 méthodes objc.

 @objc func tapDone() {
    print("tapped Done")
}

@objc func tapCancel() {
    print("tapped cancel")
}
0
ShadeToD