So zeigen Sie die Schaltfläche "Fertig" auf dem iPhone-Nummernblock an

237

Auf dem Nummernblock befindet sich keine Schaltfläche "Fertig". Wie kann ich den Nummernblock verschwinden lassen, wenn ein Benutzer die Eingabe numerischer Informationen in ein Textfeld abgeschlossen hat?

Ich könnte mit der Standardtastatur eine Schaltfläche "Fertig" erhalten, aber dann müssten Benutzer zu den Zifferntasten wechseln, um Zahlen einzugeben. Gibt es eine Möglichkeit, eine Schaltfläche "Fertig" auf dem Nummernblock anzuzeigen?

Chilly Zhong
quelle

Antworten:

339

Eine andere Lösung. Perfekt, wenn andere Textfelder ohne Nummernblock auf dem Bildschirm angezeigt werden.

inputAccessoryView

- (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];
}
Luda
quelle
1
Zweifellos der beste Weg, dies zu erreichen. Ausdrücklich, weil es an Äpfeln streng HIG festhält.
Hubert Kunnemeyer
3
Die andere Lösung ist sehr spröde in Bezug auf grafische Änderungen an der Bildschirmtastatur, die sie beschädigen.
Kailoon
Wie bestimme ich, welches UITextField bearbeitet wird, wenn mehrere Textfelder vorhanden sind?
Nate
Definieren Sie Ihr UITextField in der .h als Instanzvariable.
Luda
3
@BenPotter Sie würden den Balken für die Balkenfarbe und den Farbton für den Text festlegen. Sie können die UIBarButton-Elemente auch außerhalb des Intializers erstellen und dort explizit die Farbe für sie festlegen.
Über
50

Hier ist eine Anpassung für Ludas Antwort für Swift:

In die Deklaration Ihrer UIViewController-Unterklasse setzen

let numberToolbar: UIToolbar = UIToolbar()

in ViewDidLoad setzen:

    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 

und fügen Sie die Funktionen hoopla und hoopla hinzu (Sie können auch andere Namen auswählen, ändern Sie einfach die Selektornamen in ViewDidLoad entsprechend

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
user1258240
quelle
1
UIBarButtonItemStyle.Borderedist seit iOS 8.0 veraltet. UIBarButtonItemStyle.Plainwird stattdessen vorgeschlagen.
Jonny
Selektoren sollten aktualisiert werden auf: #selector (YourViewController.boopla)
David V
Jonny und David haben wahrscheinlich recht. Ich programmiere nicht mehr für iOS, daher folge ich den Änderungen nicht mehr. Wenn jemand eine aktualisierte Lösung veröffentlicht, werde ich in einer Bearbeitung darauf verweisen.
user1258240
14

Der Trick, den ich gesehen habe, besteht darin, eine benutzerdefinierte transparente Schaltfläche in der Größe der gesamten Ansicht zu erstellen und dann in der Klickmethode das Textfeld als Ersthelfer zurücktreten zu lassen. Der Benutzer kann also auf eine beliebige Stelle außerhalb des Felds klicken, um die Tastatur zu schließen.

davidavr
quelle
3
Ich habe dies zusätzlich zur Eingabetaste getan. Dies sorgt für eine viel benutzerfreundlichere App. Ich gebe gerne sowohl die Return-Schlüssel als auch die Click-Anywhere-Return-Methoden an.
IcyBlueRose
4
Nachdem wir UIGestureRecognizers haben, richten Sie einfach einen Tap-Gestenerkenner in der Hauptansicht des Viewcontrollers ein und lassen Sie ihn endEditing: YES an die Ansicht senden. Dadurch wird die Tastatur für jedes Textfeld geschlossen, das die Tastatur bedienen könnte, wenn sie außerhalb der Tastatur berührt wird.
Chadbag
13

Eine Swift 3- Lösung mit einer Erweiterung. Ideal, wenn UITextFieldIhre App mehrere numerische Objekte enthält, da Sie flexibel entscheiden können UITextField, ob beim Tippen auf Fertig oder Abbrechen eine benutzerdefinierte Aktion ausgeführt werden soll.

Geben Sie hier die Bildbeschreibung ein

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

Anwendungsbeispiel mit den Standardaktionen:

//
// MyViewController.swift
//

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

Anwendungsbeispiel mit einer benutzerdefinierten Aktion " Fertig" :

//
// MyViewController.swift
//

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

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}
oli
quelle
12

Unten finden Sie eine Überarbeitung von Ludas Antwort mit den folgenden Änderungen:

  • Die Zubehöransicht wird automatisch an die Breite des Anwendungsrahmens angepasst

  • Die veraltete Konstante UIBarButtonItemStyleBorderedwird vermieden

  • Die Schaltfläche "Fertig" wird als a instanziiert UIBarButtonSystemItemDone

Derzeit ist die Schaltfläche "Fertig" in der Zubehöransicht zentriert. Sie können es links oder rechts positionieren, indem Sie das Leerzeichen auf der entsprechenden Seite löschen.

Ich habe die Schaltfläche "Abbrechen" weggelassen, da die Standardtastatur auch keine hat. Wenn Sie eine Schaltfläche "Abbrechen" möchten, empfehlen wir Ihnen, diese als zu instanziieren UIBarButtonSystemItemCancelund sicherzustellen, dass Sie den ursprünglichen Wert in Ihrem Textfeld nicht verwerfen. Das in Ludas Antwort implementierte Verhalten "Abbrechen", bei dem der Wert mit einer leeren Zeichenfolge überschrieben wird, entspricht möglicherweise nicht Ihren Wünschen.

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

Weitere Informationen zum Erstellen von Zubehöransichten finden Sie in der Apple-Dokumentation zu benutzerdefinierten Ansichten für die Dateneingabe . Sie sollten wahrscheinlich auch die Referenzseiten zu UIToolbar und UIBarButtonItem konsultieren .

Michael Laszlo
quelle
[UIScreen mainScreen].applicationFrameist in iOS 9 veraltet. Verwenden Sie[UIScreen mainScreen].bounds
user-44651
11

Die Lösung in UIKeyboardTypeNumberPad und die fehlende Eingabetaste funktionieren hervorragend, jedoch nur, wenn auf dem Bildschirm keine anderen Textfelder ohne Nummernblock angezeigt werden.

Ich nahm diesen Code und verwandelte ihn in einen UIViewController, den Sie einfach in Unterklassen unterteilen können, damit die Nummernblöcke funktionieren. Sie müssen die Symbole über den obigen Link erhalten.

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

und 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

Genießen.

Archie
quelle
6

Hier ist der neueste Code. Fügen Sie einfach #import "UIViewController + NumPadReturn.h" in Ihren viewController ein.

Hier ist die .h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface UIViewController (NumPadReturn)



@end

Und sie

#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
Bryan
quelle
Dies scheint auf dem Simulator zu funktionieren, aber auf dem Gerät ... weder kann ich die Schaltfläche FERTIG sehen, noch passiert etwas, wenn ich auf den leeren Raum tippe ... eine Idee?
Xoail
14
Wow, bitte benutze diesen Code nicht. Sie haben Klassenmethoden innerhalb einer Kategorie überschrieben, wodurch das "echte" viewDidLoad usw. aus Ihrer UIViewController-Klasse ignoriert wird.
Tony Arnold
6

Eine viel einfachere Lösung

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event];

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
Govind
quelle
5

Wenn Sie mehrere numerische Felder haben, empfehle ich, UITextField in eine Unterklasse zu unterteilen, um ein NumericTextField zu erstellen, das immer eine numerische Tastatur mit einer Schaltfläche "Fertig" anzeigt. Verknüpfen Sie dann einfach Ihre numerischen Felder mit dieser Klasse im Interface Builder, und Sie benötigen keinen zusätzlichen Code in einem Ihrer View Controller. Das Folgende ist die Swift 3.0-Klasse, die ich in Xcode 8.0 verwende.

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 4.2

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: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        let callback = #selector(NumericTextField.finishedEditing)
        let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: callback)
        numericKbdToolbar.setItems([space, donebutton], animated: false)
        numericKbdToolbar.sizeToFit()
        self.inputAccessoryView = numericKbdToolbar
    }

    // MARK: On Finished Editing Function
    @objc func finishedEditing()
    {
        self.resignFirstResponder()
    }
}
Mario Hendricks
quelle
Ich bevorzuge Ihre Unterklassenlösung.
AechoLiu
5

Ich fand die Antwort von @ user1258240 ziemlich präzise, da dies nicht so einfach ist wie das Festlegen einer returnKeyTypeEigenschaft.

Ich wollte nur meinen eigenen "wiederverwendbaren" Ansatz dazu beitragen:

func SetDoneToolbar(field:UITextField) {
    let doneToolbar:UIToolbar = UIToolbar()

    doneToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.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)
}
Matt Borja
quelle
3

SWIFT 3.0 Ein anderer Geschmack, der Teile einiger vorheriger Antworten verwendet.

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()
}
Abdurrahman Mubeen Ali
quelle
2

Ich beschreibe eine Lösung für iOS 4.2+ hier aber die Schaltfläche , nachdem die Tastatur angezeigt wird. Es ist nicht schrecklich, aber auch nicht ideal.

Die in der oben verlinkten Frage beschriebene Lösung beinhaltet eine elegantere Illusion, die Schaltfläche zu schließen, wobei ich die Schaltfläche ausblende und vertikal verschiebe, um den Eindruck zu erwecken, dass die Tastatur und die Schaltfläche zusammen geschlossen werden.

FluffulousChimp
quelle
2

Der einfachste Weg ist:

Erstellen Sie eine benutzerdefinierte transparente Schaltfläche und platzieren Sie sie in der linken unteren Ecke, in der sich der CGSizeleere Bereich befindet UIKeyboardTypeNumberPad. Schalten Sie diese Schaltfläche in textField becomeFirstResponderbzw. beim Klicken auf die Schaltfläche ein ( ein- / ausblenden) .

Almas Adilbek
quelle
2

Hier ist die einfachste Lösung, die mir begegnet ist. Ich habe dies aus dem Buch Beginning iOS 5 Development gelernt.

Unter der Annahme , das Nummernfeld wird aufgerufen numberField.

  1. In ViewControllerden folgenden Verfahren:

    -(IBAction)closeKeyboard:(id)sender;
  2. In ViewController.mden folgenden Code:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
  3. Gehen Sie zurück zur nibDatei.

  4. UtilitiesPfanne öffnen .
  5. Öffnen Sie die Identity inspectorunter UtilitiesPfanne.
  6. Klicken Sie einmal auf die View(in der NIB-Datei). Stellen Sie sicher, dass Sie keines der Elemente in der Ansicht angeklickt haben. Zur Verdeutlichung sollten Sie UIView unter Classin sehenIdentity inspector .
  7. Ändern Sie die Klasse von UIView in UIControl.
  8. Öffnen Connection Inspector.
  9. Klicken und ziehen Sie Touch Downden Pfeil auf das File OwnerSymbol und legen Sie ihn dort ab . (Zu Ihrer Information ... Das Symbol für den Dateibesitzer wird links von angezeigt Viewund als hohler Würfel mit gelbem Rahmen angezeigt .)
  10. Wählen Sie die Methode : closeKeyboard.
  11. Führen Sie das Programm aus.

Wenn Sie jetzt auf eine beliebige Stelle im Hintergrund von klicken View, sollten Sie die Tastatur schließen können.

Ich hoffe, dies hilft Ihnen bei der Lösung Ihres Problems. :-)

Rutvij Kotecha
quelle
2

Ich habe Bryans Lösung so modifiziert, dass sie etwas robuster ist, damit sie gut mit anderen Tastaturtypen funktioniert, die in derselben Ansicht angezeigt werden können. Es wird hier beschrieben:

Erstellen Sie eine Schaltfläche FERTIG auf dem iOS-Nummernblock UIKeyboard

Ich würde versuchen, es hier zu erklären, aber das meiste davon ist Code zum Anschauen, der hier nicht leicht passt

Hufeisen7
quelle
Dies war die beste Lösung, die ich für XCode 4.5 gefunden habe und sie funktioniert mit iOS 6.0. Der numerischen Tastatur wird eine Schaltfläche FERTIG hinzugefügt. Gehen Sie zum ursprünglichen Beitrag, um die Grafiken der Schaltfläche FERTIG zu erhalten. neoos.ch/blog/…
Vogelmann
2

Wenn Sie die Anzahl der einzugebenden Nummern im Voraus kennen (z. B. eine 4-stellige PIN), können Sie diese nach 4 Tastendrücken gemäß meiner Antwort auf diese ähnliche Frage automatisch schließen:

Nummernblock entlassen

In diesem Fall ist keine zusätzliche Schaltfläche "Fertig" erforderlich.

Scipilot
quelle
2

Wir können die Lösung "Benutzer woanders berührt" auch noch einfacher machen, wenn wir nur die Ansicht unseres View Controllers anweisen, die Bearbeitung zu beenden:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 { 
      [super touchesBegan:touches withEvent:event];

      [self.view endEditing:YES]; //YES ignores any textfield refusal to resign
 }

... unter der Annahme, dass "Berühren an anderer Stelle die Tastatur schließt" das gewünschte Verhalten auch für andere bearbeitbare Felder in der Ansicht ist.

Sitric
quelle
1

Für Swift 2.2 benutze ich dies

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()
}
Dx_
quelle
0

Alle Implementierungen zum Suchen der Tastaturansicht und zum Hinzufügen der Schaltfläche "Fertig" in der 3. Zeile (daher beträgt die Tastaturhöhe von button.y = 163 b / c 216) sind fragil, da iOS die Ansichtshierarchie ständig ändert. Zum Beispiel funktioniert keiner der oben genannten Codes für iOS9.

Ich denke, es ist sicherer, nur die oberste Ansicht in [[[UIApplication sharedApplication] -Fenster] lastObject] zu finden und einfach die Schaltfläche in der unteren linken Ecke hinzuzufügen, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // Porträtmodus

Qiulang
quelle
0

Swift 2.2 / Ich habe die Antwort von Dx_ verwendet. Ich wollte diese Funktionalität jedoch auf allen Tastaturen. Also habe ich in meine Basisklasse den Code eingefügt:

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

Rufen Sie dann einfach addDoneButtonForTextFields auf self.view.subviews in viewDidLoad (oder willDisplayCell, wenn Sie eine Tabellenansicht verwenden) auf, um allen Tastaturen die Schaltfläche Fertig hinzuzufügen.

John
quelle