Ciao Ragazzi… eccomi con un altro tutorial abbastanza particolare… Durante lo sviluppo di una mia App alcuni utenti si erano lamentati perchè ogni volta dovevano cliccare su un bottone nella Navigation Bar per far scomparire la tastiera… Nelle tastiere numeriche, infatti, non è presente il tasto Done, e io volevo inserirlo! Così, cercando un po’ in rete e mettendo insieme alcuni pezzi scovati, ho composto la mia tastiera tutta nuova…
Partiamo creando un nuovo progetto e chiamiamolo “Keyboard”. Aggiungere il tasto è in realtà molto semplice, mettiamo semplicemente una notifica che come oggetto ha la comparsa della tastiera. Quando la tastiera compare aggiungiamo alla vista della tastiera un bottone, che come immagine ha proprio la scritta DONE.
Partiamo quindi ad inserie i valori sul nostro file di intestazione .h
@interface keyboardViewController : UIViewController {
IBOutlet UITextField * txt;
}
@end
Praticamente non abbiamo fatto altro che aggiungere il delegato UITextFieldDelegate e un campo di testo.
Bene ora dobbiamo aprire il file “KeyboardViewController.xib” ed inserire quindi un campo di testo, infine, colleghiamo i vari elementi
Ecco come dovrebbe apparire il tutto:

Bene, adesso facciamo in modo che la tastiera mostrata sia quella numerica, possiamo farlo sia via codice che graficamente:
txt.keyboardType = UIKeyboardTypeNumberPad;
Fatto questo aggiungiamo le notifiche per l’aggiunta del bottone:
- (void)viewDidLoad
{
[super viewDidLoad];
txt.keyboardType = UIKeyboardTypeNumberPad;
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
{
[self addButtonToKeyboard];
}
- (void)keyboardDidShow:(NSNotification *)note
{
[self addButtonToKeyboard];
}
Nel primo if controlliamo la versione del sistema operativo e in base alla versione aggiungiamo una delle due notifiche, questo perchè la comparsa della tastiera viene notificata da due metodi diversi :
UIKeyboardDidShowNotification per il nuovo iOS 4 e UIKeyboardWillShowNotification per gli iOS precedenti. Quindi, in base alla notifica, faremo partire il metodo indicato… questi due non faranno altro che far partire il metodo addButtonToKeyboard, che avrà il compito di aggiungere il tasto…
- (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;
//NSLog(@"%@", 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];
}
}
}
Questo è il metodo fondamentale… dalla riga 22 alla 34 creiamo il nostro bottone, (con iOS 4 è stata modificata anche la tastiera, abbiamo quindi delle immagini diverse a seconda del sistema operativo) e gli aggiungiamo il metodo doneButton per poi togliere la tastiera.
Dalla 36 alla 50 prendetele un po’ come un Must, il compito di questo pezzo è quello di trovare la vista della tastiera, e se la descrizione della tastiera ritorna una stringa tipo: @”
Bene, ora non ci resta che aggiungere il metodo doneButton per far scomparire la tastiera:
- (void)doneButton:(id)sender {
[textField resignFirstResponder];
}
Finito!!
Vi allego il progetto cosi potete scaricare le immagini per il bottone.
Sperò di esservi stato utile!! 🙂

14 Responses to “T#061 – Aggiungiamo il tasto “DONE” alla tastiera numerica”
2 Luglio 2010
Il ProfetaPiccola domanda… Ma la apple potrebbe accettare una applicazione con questo tipo di “tastiera CUSTOM”????
Oppure verrebbe rifiutata?!
2 Luglio 2010
andreaAppCodeLa mia applicazione usa questo tipo di tastiera, ed è sempre stata accettata.. se ci pensi anche loro lo fanno, con la tastiera del telefono…. Non verrà rifiutata….
2 Luglio 2010
LeleMolto utile grazie, volevo fare una domanda…sarebbe possibile intercettare un doppio tap sullo schermo per la chiusura della tastiera oltre al bottone “done” ?
2 Luglio 2010
andreaAppCodemhhh…. penso di si… ma dipenderebbe che oggetti hai nella tua vista, ogni oggetto reagisce diversamente ad un tocco, dipende dai delegati…. non so… sarebbe interessante approfondire…..:)
3 Luglio 2010
FiliSarebbe possibile sostituire al tasto done un tasto ad esempio punto (.) da utilizzare ad esempio in applicazioni “matematiche” che richiedono l’inserimento di valori nuemerici con la virgola?
4 Luglio 2010
andreaAppCodecerto… possiamo inserire qualunque tasto e fargli fare qualsiasi azione…
4 Luglio 2010
GinoVeramente utile come tutorial, testato subito in una mia app dove mi serviva… ottimo!!!
grazie
4 Luglio 2010
andreaAppCodegrazie mille, fra un po vedremo anche come inserire una navigation bar sopra la tastiera stile Safari….
3 Agosto 2010
xTuMiOxbello, funziona ma non nel caso in cui ci siano più text in cui si necessita l’uso di tastiere diverse, infatti se ad esempio in un altro textField uso la tastiera di default mi apparirà lo stesso il pulsante done… e la cosa non è bellissima..
3 Agosto 2010
andreaAppCodebeh, basta usare il metodo ActiveField in cui imposti il txt in cui si trova il cursore, e nel metodo addButton controlli, se il txtCorrente usa la tastiera numerica allora lo fai comparire… è molto semplice…
19 Settembre 2010
gahttp://stackoverflow.com/questions/3742642/how-to-use-the-new-uikeyboardtypedecimalpad-feature-in-ios-4-1-sdk
;D
2 Dicembre 2010
rufyho una domanda: ma se volessi creare una tastiera personalizzata? come potrei fare?
17 Marzo 2011
Matteciao,visto che sono proprio inesperto di queste cose..e mi ritrovo il tasto done su tutte le tastiere che compaiono nei vari uitab, potresti spiegare meglio come far comparire il tasto done per un certo uitextfield? grazie!!
14 Aprile 2012
geminimacciao,
testato e funzionante con singola vista…
quando però la app possiede due viste il Done si incanta e non funziona più…
come si potrebbe correggere il problema?
grazie