Come mostrare il pulsante sul numero iPhone pad "Fatto"

voti
208

Non c'è un pulsante Done sul tastierino numerico. Quando un utente termina l'inserimento di informazioni numeriche in un campo di testo, come posso fare il tastierino numerico scomparire?

Ho potuto ottenere un pulsante Done utilizzando la tastiera di default, ma poi gli utenti dovuto passare i tasti numerici per immettere i numeri. C'è un modo per mostrare un pulsante Done sul tastierino numerico?

È pubblicato 25/02/2009 alle 03:45
fonte dall'utente
In altre lingue...                            


21 risposte

voti
321

Un'altra soluzione. Perfetto se ci sono altri campi di testo non tastierino numerico sullo schermo.

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];
}
Risposto il 08/07/2012 a 10:26
fonte dall'utente

voti
37

Ecco un adattamento per la risposta di Luda per Swift:

Nella dichiarazione del vostro UIViewController sottoclasse put

let numberToolbar: UIToolbar = UIToolbar()

in viewDidLoad mettere:

    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 

e aggiungere il trambusto funzioni e trambusto (sentitevi liberi di scegliere altri nomi, basta cambiare i nomi di selezione in viewDidLoad conseguenza

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
Risposto il 24/02/2015 a 22:24
fonte dall'utente

voti
14

Il trucco che ho visto usare è quello di creare un pulsante trasparente personalizzato la dimensione di tutta la vista e poi nel suo metodo clic, avere il campo di testo dimissioni first responder. Così l'utente può cliccare ovunque al di fuori del campo per chiudere la tastiera.

Risposto il 25/02/2009 a 05:07
fonte dall'utente

voti
11

La soluzione in UIKeyboardTypeNumberPad e tasto di ritorno manca grandi opere, ma solo se non ci sono altri non-numero campi di testo pad sullo schermo.

Ho preso quel codice e lo ha trasformato in un UIViewController che si può semplicemente creare una sottoclasse per fare i rilievi numero di lavoro. Avrete bisogno di ottenere le icone dal link qui sopra.

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

e 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

Godere.

Risposto il 05/08/2010 a 21:16
fonte dall'utente

voti
9

Qui di seguito è una revisione della risposta di Luda con le seguenti modifiche:

  • la vista accessorio è dimensionato automaticamente alla larghezza della cornice dell'applicazione

  • la costante deprecato UIBarButtonItemStyleBorderedviene evitata

  • il pulsante "Done" viene istanziato come UIBarButtonSystemItemDone

Attualmente il pulsante "Done" è centrata nella vista accessori. È possibile posizionarlo a sinistra oa destra eliminando lo spazio sul lato pertinente.

Ho omesso un pulsante "Annulla", perché la tastiera di default non ne ha uno neanche. Se si desidera un pulsante "Annulla", suggerisco che si crea un'istanza come UIBarButtonSystemItemCancele che si assicura che non stai scartando il valore originale nel campo di testo. Il comportamento "Annulla", realizzata in risposta di Luda, che sovrascrive il valore con una stringa vuota, non può essere quello che vuoi.

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

Per ulteriori informazioni sulla creazione di viste accessori, consultare la documentazione Apple su visualizzazioni personalizzate per l'input dei dati . Probabilmente si vorrà consultare le pagine di riferimento sui UIToolbar e UIBarButtonItem pure.

Risposto il 16/07/2015 a 10:16
fonte dall'utente

voti
6

Una soluzione molto più semplice

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

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
Risposto il 04/08/2011 a 12:01
fonte dall'utente

voti
6

Ecco il codice più recente. È sufficiente includere #import "UIViewController + NumPadReturn.h" nel tuo viewController.

Ecco l'.h

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

@interface UIViewController (NumPadReturn)



@end

E loro

#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
Risposto il 04/12/2010 a 21:57
fonte dall'utente

voti
5

Questo post forum descrive come personalizzare l'UIKeyboard aggiungere la visualizzazione personalizzata sulla tastiera.

Risposto il 25/02/2009 a 05:48
fonte dall'utente

voti
3

SWIFT 3.0 un sapore diverso, utilizzando parti di alcune risposte precedenti.

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()
}
Risposto il 11/09/2017 a 11:41
fonte dall'utente

voti
3

A 3 Swift soluzione utilizzando l'estensione. Ideale se si dispone di diversi numerici UITextFieldoggetti nella vostra applicazione in quanto dà la possibilità di decidere, per ogni UITextField, se eseguire un'azione personalizzata quando Fatto o Cancellare si tocca.

entrare descrizione dell'immagine qui

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

Esempio di utilizzo con le azioni predefinite:

//
// MyViewController.swift
//

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

Esempio di utilizzo con un costume Fatto azione:

//
// MyViewController.swift
//

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

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}
Risposto il 19/08/2017 a 11:40
fonte dall'utente

voti
2

Ho trovato la risposta di @ user1258240 essere abbastanza conciso dato questo non è così semplice come impostazione di una returnKeyTypeproprietà.

Volevo solo contribuire il mio approccio "riutilizzabile" a questa:

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)
}
Risposto il 04/11/2016 a 05:34
fonte dall'utente

voti
2

Se si dispone di più campi numerici, suggerisco sottoclasse UITextField per creare un NumericTextField che visualizza sempre una tastiera numerica con un pulsante fatto. Quindi, è sufficiente associare i campi numerici con questa classe in Interface Builder e non sarà necessario alcun codice aggiuntivo in uno dei tuoi View Controller. Di seguito è Swift 3.0 classe che sto usando in Xcode 8.0.

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()
    }
}
Risposto il 02/10/2016 a 13:07
fonte dall'utente

voti
2

Possiamo anche fare il "utente toccato da qualche altra parte" soluzione ancora più semplice se ci limitiamo a dire vista del nostro controller della vista per terminare la modifica:

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

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

... partendo dal presupposto che "toccare altrove respinge la tastiera" è desiderato comportamento per tutti gli altri campi modificabili per la vista pure.

Risposto il 06/05/2015 a 23:46
fonte dall'utente

voti
2

Se si conosce in anticipo il numero di numeri da inserire (per esempio un PIN a 4 cifre) si potrebbe auto-respingere dopo 4 tasti premuti, come per la mia risposta a questa domanda simile:

che respinge Number Pad

Non c'è bisogno di un pulsante aggiuntivo fatto in questo caso.

Risposto il 16/05/2013 a 14:50
fonte dall'utente

voti
2

Ho modificato la soluzione di Bryan ad essere un po 'più robusto, in modo che sarebbe giocare bene con altri tipi di tastiere che potrebbero apparire nella stessa vista. E 'descritto qui:

Creare un pulsante fatto sul tastierino numerico iOS UIKeyboard

Mi piacerebbe provare a spiegarlo qui, ma la maggior parte di esso è il codice a guardare, che non si adatterebbe facilmente qui

Risposto il 04/10/2012 a 08:38
fonte dall'utente

voti
2

Ecco la soluzione più semplice che abbia mai incontrato. Ho imparato questo dall'inizio iOS 5 Development libro.

Supponendo che il campo numero viene chiamato numberField.

  1. In ViewController, aggiungere il seguente metodo:

    -(IBAction)closeKeyboard:(id)sender;
    
  2. In ViewController.m, aggiungere il seguente codice:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
  3. Torna nibfile.

  4. Aprire Utilitiespadella.
  5. Aprire il Identity inspectorsotto Utilitiespadella.
  6. Fare clic sul View(nel file nib) una volta. Assicurati di non aver fatto clic su uno qualsiasi degli elementi nella vista. Per motivi di chiarezza, si dovrebbe vedere UIView sotto Classin Identity inspector.
  7. Cambiare la classe da UIView a UIControl.
  8. Aprire Connection Inspector.
  9. Fare clic e trascinare Touch Downe rilasciare la freccia sul File Ownersimbolo. (FYI ... icona del file Proprietario viene visualizzata sul lato sinistro della Viewe appare come un cubo cavo con cornice gialla.)
  10. Selezionare il metodo: closeKeyboard.
  11. Eseguire il programma.

Ora, quando si fa clic su un punto qualsiasi sfondo di View, si dovrebbe essere in grado di nascondere la tastiera.

Spero che questo aiuti a risolvere il problema. :-)

Risposto il 12/09/2012 a 16:07
fonte dall'utente

voti
2

Il più semplice modo è:

Creare pulsante trasparente personalizzato e posizionarlo nell'angolo in basso a sinistra, che avrà lo stesso CGSizecome spazio vuoto UIKeyboardTypeNumberPad. Toggle (mostra / nascondi) questo pulsante textField becomeFirstResponder, il pulsante di scatto, rispettivamente.

Risposto il 26/06/2012 a 12:44
fonte dall'utente

voti
2

Descrivo una soluzione per iOS 4.2+ qui ma il pulsante respingere sfuma dopo la visualizzazione della tastiera. Non è terribile, ma non è l'ideale sia.

La soluzione descritta nella questione linkato sopra include una più elegante illusione di respingere il pulsante, dove I fade e verticalmente spostare il pulsante di fornire l'aspetto che la tastiera e il pulsante sono respingendo insieme.

Risposto il 23/04/2011 a 22:28
fonte dall'utente

voti
1

Per Swift 2.2 Io uso questo

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()
}
Risposto il 04/05/2016 a 08:23
fonte dall'utente

voti
0

Swift 2.2 / Ho usato la risposta di Dx_. Tuttavia, ho voluto questa funzionalità su tutte le tastiere. Così nella mia classe di base ho messo il codice:

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

Poi basta chiamare addDoneButtonForTextFields su self.view.subviews a viewDidLoad (o willDisplayCell se si utilizza una vista tabella) per aggiungere il pulsante Fine per tutte le tastiere.

Risposto il 23/08/2016 a 17:09
fonte dall'utente

voti
0

Tutti coloro implementazione di trovare la vista della tastiera e l'aggiunta del tasto fatto a 3 ° fila (che è il motivo per cui l'altezza button.y = 163 b / c della tastiera è 216) sono fragili perché iOS mantiene cambiare la gerarchia della vista. Per esempio nessuno dei codici di cui sopra lavorare per iOS9.

Penso che sia più sicura di trovare solo la vista più alto, da [[[UIApplication sharedApplication] finestre] LastObject], e basta aggiungere il pulsante in basso a sinistra di esso, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // modalità verticale

Risposto il 07/12/2015 a 09:36
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more