it-swarm.com.de

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

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 einen "Fertig" -Button mit der Standardtastatur erhalten, aber dann müssten Benutzer zu den numerischen Tasten wechseln, um Zahlen einzugeben. Gibt es eine Möglichkeit, eine Schaltfläche "Fertig" auf dem Nummernblock anzuzeigen?

231
Chilly Zhong

Eine andere Lösung. Perfekt, wenn auf dem Bildschirm andere Textfelder angezeigt werden, die keine Ziffernblöcke sind.

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];
}
334
Luda

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

In der 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 Auswahlnamen in ViewDidLoad entsprechend

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
49
user1258240

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

14
davidavr

Nachfolgend 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 UIBarButtonItemStyleBordered wird vermieden

  • die Schaltfläche "Fertig" wird als UIBarButtonSystemItemDone instanziiert.

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

Ich habe die Schaltfläche "Abbrechen" weggelassen, weil die Standardtastatur auch keine hat. Wenn Sie die Schaltfläche "Abbrechen" möchten, sollten Sie sie als UIBarButtonSystemItemCancel instanziieren und sicherstellen, dass Sie den ursprünglichen Wert in Ihrem Textfeld nicht verwerfen. Das in Ludas Antwort implementierte "Abbrechen" -Verhalten, 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 benutzerdefinierte Ansichten für die Dateneingabe . Sie sollten wahrscheinlich die Referenzseiten zu IToolbar) konsultieren und IBarButtonItem ebenfalls.

11
Michael Laszlo

Die Lösung in IKeyboardTypeNumberPad und fehlende Eingabetaste funktioniert hervorragend, aber nur, wenn auf dem Bildschirm keine anderen Textfelder ohne Ziffernblock angezeigt werden.

Ich nahm diesen Code und wandelte ihn in einen UIViewController um, den Sie einfach in Unterklassen unterteilen können, damit die Nummernblöcke funktionieren. Sie müssen die Symbole aus dem 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.

11
Archie

Eine Swift 3 Lösung unter Verwendung einer Erweiterung. Ideal, wenn Ihre App mehrere numerische UITextField Objekte enthält, da Sie für jedes UITextField flexibel entscheiden können, ob eine benutzerdefinierte Aktion ausgeführt werden soll, wenn Fertig oder Abbrechen wird getippt.

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

Anwendungsbeispiel mit den Standardaktionen:

//
// MyViewController.Swift
//

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

Beispiel für die Verwendung einer benutzerdefinierten Fertig Aktion:

//
// MyViewController.Swift
//

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

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

Eine viel einfachere Lösung

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

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
6
iGo

Hier ist der neueste Code. Fügen Sie einfach den 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
6
Bryan

Dieser Forumsbeitrag beschreibt, wie Sie das UIKeyboard anpassen, um Ihre benutzerdefinierte Ansicht auf der Tastatur hinzuzufügen.

5
shek

Ich fand @ user1258240s Antwort ziemlich prägnant, da dies nicht so einfach ist wie das Setzen einer returnKeyType -Eigenschaft.

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

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

    doneToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.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)
}
4
rdev5

Wenn Sie mehrere numerische Felder haben, empfehle ich die Unterklasse UITextField, um ein NumericTextField zu erstellen, das immer eine numerische Tastatur mit einer Fertigschaltfläche anzeigt. Verknüpfen Sie dann einfach Ihre numerischen Felder mit dieser Klasse im Interface Builder, und Sie benötigen keinen zusätzlichen Code in Ihren View Controllern. 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()
    }
}
3
Mario Hendricks

Swift 3. Ein anderer Geschmack, der Teile früherer 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()
}

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

Angenommen, das Zahlenfeld heißt numberField.

  1. Fügen Sie in ViewController die folgende Methode hinzu:

    -(IBAction)closeKeyboard:(id)sender;
    
  2. Im ViewController.m, fügen Sie den folgenden Code hinzu:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
  3. Gehe zurück zur nib Datei.

  4. Öffne Utilities pan.
  5. Öffne das Identity inspector unter Utilities pan.
  6. Klicken Sie einmal auf das View (in der NIB-Datei). Stellen Sie sicher, dass Sie keines der Elemente in der Ansicht angeklickt haben. Zur Verdeutlichung sollte UIView unter Class in Identity inspector.
  7. Ändern Sie die Klasse von UIView in UIControl.
  8. Öffne Connection Inspector.
  9. Klicken und Ziehen Touch Down und lege den Pfeil auf File Owner Symbol. (FYI ... Das Dateibesitzer-Symbol wird links von View angezeigt und als hohler Würfel mit gelbem Rahmen angezeigt.)
  10. Wählen Sie die Methode: closeKeyboard.
  11. Führen Sie das Programm aus.

Wenn Sie nun irgendwo auf den Hintergrund von View klicken, sollten Sie die Tastatur schließen können.

Hoffe das hilft dir dein Problem zu lösen. :-)

2
Rutvij Kotecha

Wir können auch die "Benutzer an einer anderen Stelle berührt" Lösung noch einfacher machen, wenn wir nur unsere Ansicht mitteilen Controller-Ansicht zum Beenden der Bearbeitung:

-(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 "Andernorts berühren die Tastatur entlässt", ist das gewünschte Verhalten auch für alle anderen bearbeitbaren Felder in der Ansicht.

2
Sitric

Ich beschreibe eine Lösung für iOS 4.2+ hier , aber die Schaltfläche zum Schließen wird eingeblendet, 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 Taste zu schließen, wobei ich die Taste verblasse und vertikal verschiebe, um den Eindruck zu erwecken, dass die Tastatur und die Taste zusammen geschlossen werden.

2
FluffulousChimp

Der einfachste Weg ist:

Erstellen Sie benutzerdefinierte transparente Schaltfläche und platzieren Sie sie in der linken unteren Ecke, die dasselbe CGSize wie das Leerzeichen in UIKeyboardTypeNumberPad enthält. Schalten Sie diese Schaltfläche auf textField becomeFirstResponder um (zeigen/verbergen) bzw. klicken Sie auf die Schaltfläche.

2
Almas Adilbek

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

Nummernblock wird entfernt

In diesem Fall ist keine zusätzliche Fertigschaltfläche erforderlich.

2
scipilot

Ich habe Bryans Lösung ein wenig robuster gestaltet, damit sie gut mit anderen Tastaturen zusammenarbeitet, die in der gleichen Ansicht angezeigt werden können. Es ist 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 einfach passt

2
horseshoe7

Für Swift 2.2 verwende 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()
}
1
Dx_

Swift 2.2/Ich habe die Antwort von Dx_ verwendet. Diese Funktionalität wollte ich jedoch auf allen Tastaturen haben. Also füge ich in meine Basisklasse den Code ein:

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.

0
John

Alle Implementierungen zum Finden der Tastaturansicht und zum Hinzufügen der Fertig-Schaltfläche in der 3. Zeile (aus diesem Grund 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 obigen Codes für iOS9.

Ich denke, es ist sicherer, einfach die oberste Ansicht durch [[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); // Hochformat

0
Qiulang