Wie füge ich Numpad in iOS mit Swift die Schaltfläche "Fertig" hinzu?


77

Es funktioniert gut mit der Standardtastatur, aber ich kann es nicht mit dem Nummernblock zum Laufen bringen.

Irgendwelche Ideen?



2
Ich bin nicht daran interessiert, eine neue Tastatur zu erstellen. Ich möchte nur eine Schaltfläche zur UIToolBar hinzufügen und sie dann als inputAccessoryView zum Textfeld hinzufügen, wie hier: stackoverflow.com/a/11382044/3207979 , aber ich habe es nicht herausgefunden noch, wie es schnell geht ..
Dejan Skledar

Anstelle einer benutzerdefinierten Tastatur oder Symbolleiste können wir dies erreichen, indem wir der Standardtastatur eine benutzerdefinierte Schaltfläche hinzufügen. Verweisen Sie auf diese Antwort .
Nazik

Antworten:


96

Soweit ich weiß, können Sie die Schaltfläche Fertig auf dem Tastaturteil nicht hinzufügen. Sie müssten inputAccessoryViewdem UITextFieldoder ein hinzufügen UITextView(wenn Sie dies verwenden).

Weitere Informationen finden Sie in der Dokumentation .

Bearbeiten : In dieser Frage finden Sie ein Beispiel dafür.

Edit 2 : Ähnliches Beispiel in Swift .

Bearbeiten 3 : Code aus Bearbeiten 2, da der Link möglicherweise abläuft.

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

Funktioniert perfekt. Schnelle und einfache Implementierung. Vielen Dank!
Octavio Antonio Cedeño

3
Sie können dies ändern und müssen die Schaltfläche nicht lokalisieren: let done: UIBarButtonItem = UIBarButtonItem (barButtonSystemItem: UIBarButtonSystemItem.done, Ziel: self, Aktion: #selector (self.doneButtonAction))
Zeezer

59

Eine Swift-3-Version ( von Markos Lösung - die für mich funktioniert hat )

( In meinem Fall habe ich ein UITextField als identifizierttextfield )

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

46

Swift 5 Lösung mit @IBInpectableund Erweiterung. Für jeden UITextField im Projekt wird unter dem Attributinspektor im Interface Builder eine Dropdown-Liste angezeigt.

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
    }

    @objc func doneButtonAction()
    {
        self.resignFirstResponder()
    }
}

2
Fantastische Antwort. Ich hoffe, alle scrollen hier runter.
Biomiker

1
Gute Antwort. Ich habe es in meinem Code verwendet
Firas Shrourou

15

Sie können der Tastatur eine Symbolleiste mit der Schaltfläche Fertig hinzufügen. InputAccessoryViewDie Eigenschaft des Textfelds kann zum Festlegen dieser Symbolleiste verwendet werden.

Unten ist der Code, den ich in meinem Fall verwendet habe

//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

Bildschirmfoto


5

Wenn Ihre DoneSchaltfläche nur den Nummernblock schließen soll, ist es am einfachsten, resignFirstResponderals Auswahl wie folgt aufzurufen :

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

Dieser Code funktioniert in iOS9 und Swift 2, ich verwende ihn in meiner App:

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
}

3

Lassen Sie mich zunächst eines sagen: Sie können eine Fertig-Schaltfläche auf Ihrem Standard-Keyboard hinzufügen. Eigentlich habe ich heute gerade dieses Problem durchgearbeitet und gelöst. Ready Made Code, platzieren Sie diesen einfach in Ihrer .swift-Klasse. Ich benutze Xcode 7 und teste dies mit iPad Retina (ios 9).

Jedenfalls wird hier nicht mehr geredet, der Code.

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

Welches gibt mir die Lösung als ...

Geben Sie hier die Bildbeschreibung ein

Noch etwas möchte ich Ihnen nur sagen, dass dies die funktionierende Lösung ist, die ich in meinem letzten Projekt verwendet habe. Ich habe dies gepostet, da für dieses Problem keine funktionierende Lösung verfügbar ist. Arbeitscode und Erklärung wie versprochen.

EDIT: -

Professioneller machen ... Wenn Sie den obigen Code befolgen, erhalten Sie auch die funktionierende Lösung, aber hier versuche ich, ihn professioneller zu gestalten. Bitte beachten Sie den Code MOD. Ich habe den vorherigen unbenutzten Code mit Anführungszeichen belassen.

Änderungen..

  1. Erstellen eines einzelnen Schaltflächenobjekts
  2. Festlegen der Symbolleiste
  3. Reduzieren der Größe der zuvor erstellten Symbolleiste
  4. Positionieren Sie die benutzerdefinierte Schaltfläche mit FlexSpace und NegativeSpace links auf dem Bildschirm.

    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
    }
    

Es gibt mir jetzt folgendes ... Außerdem versuche, die Bilder abzugleichen und die Änderungen zu finden.

Geben Sie hier die Bildbeschreibung ein

Vielen Dank.

Hoffe das hat geholfen. Entschuldigung für die lange Antwort.


3

Die einfachste Lösung, die ich finden konnte - funktioniert mit Swift 4.2 - hoffe das hilft :)

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

Anschließend können Sie die ausgeführte Aktion in der textFieldDidEndEditingDelegate-Methode ausführen oder der Erweiterung einfach eine benutzerdefinierte Methode hinzufügen und diese im Selektor der festlegen doneButton.


Hervorragende, einfache und elegante Lösung!
MrMins

3

Da die obigen Antworten in Xcode 11 und höher alt sind, wird bei der ersten ToolBar-Funktion UIToolbar()jedes Mal , wenn Sie wie hier ausgeführt werden, eine brechende Einschränkung auf die Konsole angewendetUIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) stattdessen

Beispielcode

            let toolBar =  UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35))
            toolBar.barStyle = .default
            toolBar.sizeToFit()

            // Adding Button ToolBar
            let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneButtonTapped))
            toolBar.items = [doneButton]
            toolBar.isUserInteractionEnabled = true
            textField.inputAccessoryView = toolBar

Das funktioniert, aber wie sind Sie auf einen Rahmen von 35 gekommen?
Geohei

1
Ich denke, es ist die Standardhöhe, möglicherweise können Sie sie so konfigurieren, dass sie sich ändert
SuryaKantSharma

Sie können eine beliebige Zahl einstellen (versucht 0 bis 999). Es scheint, dass dies nichts zu ändern scheint.
Geohei

2

Laut Marko Nikolovski antworten

Hier ist die Antwort von Ziel 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];
}

2

Sie können eine benutzerdefinierte Klasse erstellen. Ich benutze 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()
    }
}

1
Das war ein Vergnügen für mich. Einfach kopiert und am Ende der .swift-Datei eingefügt und dann verwendet: textfieldOutput.addDoneButtonOnKeyboard () in ViewDidLoad. Vielen Dank!
David_2877

2

Ich würde eine Bibliothek namens IQKeyboardManagerSwift verwenden .

Sie müssen eine Codezeile in die didDinegates didFinishWithLaunching-Methode von AppDelegates einfügen und alle erforderlichen Funktionen auf alle TextFields anwenden.

import IQKeyboardManagerSwift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    //Following line is all you need and it applies for all TextFields
    IQKeyboardManager.shared.enable = true
    return true
}

0

Einfache und einfache Möglichkeit, die Schaltfläche "FERTIG" auf einer beliebigen Tastatur hinzuzufügen, ist das Hinzufügen einer universellen Bibliothek

IQKeyboardManager

Fügen Sie den folgenden Code in appdelegate bei der Anwendung hinzu (_ application: UIApplication, didFinishLaunchingWithOptions.

IQKeyboardManager.shared.enable = true
IQKeyboardManager.shared.enableAutoToolbar = true
IQKeyboardManager.shared.keyboardDistanceFromTextField = 15
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.