2011-01-12 13 views
8

Ho una tastiera personalizzata che sto usando per modificare il testo in mytextField e funziona benissimo. Tuttavia, non riesco mai a ottenere il delegato shouldChangeCharactersInRange da eseguire utilizzando la mia tastiera personalizzata. Esegue quando utilizzo la mia tastiera attuale (ovviamente non la tastiera predefinita per iPhone, dal momento che sono impostato su mytextField.inputView = numberPad.view). Cosa devo fare per provocare l'attivazione del delegato shouldChangeCharactersInRange utilizzando la tastiera personalizzata? A proposito, la tastiera personalizzata è solo un mucchio di pulsanti.Come posso ottenere UITextFieldDelegate.shouldChangeCharactersInRange per attivare con inputView personalizzato?

- (void) numberPadPressed: (UIButton *)sender { 
    [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; 
    NSLog(@"shouldChangeCharactersInRange: %@", resultingString); 
    return true; 
} 

- (void)viewDidLoad { 
    mytextField.text = @""; 
    mytextField.inputView = numberPad.view; 
    mytextField.delegate = self; 
    [mytextField becomeFirstResponder]; 
} 

risposta

0

Modifica: scusa, ho frainteso la tua domanda in precedenza.

Il vostro campo di testo chiama shouldChangeCharactersInRange quando diventa l'input dalla tastiera del sistema , dandovi l'opportunità di determinare se il testo deve effettivamente visualizzare (per esempio si potrebbe implementare per riconoscere una scorciatoia e inserire del testo più lungo). Ma il campo di testo non riconosce l'input dalla tua vista personalizzata come input di testo.

Se si dispone di un inputView personalizzato, non è necessario invocare questo metodo - solo aggiornare il campo di testo direttamente dal vostro IBAction:

- (IBAction) numberPadPressed: (UIButton *)sender { 
    NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; 
    [mytextField setText:newText]; 
} 
+0

Ho appena testato utilizzando il tuo suggerimento sopra, ma ancora dovrebbeChangeCharactersInRange non ha sparato quando viene chiamato numberPadPressed. Penso che siamo sulla strada giusta ... – docchang

+0

Come calcolerò l'intervallo? C'è un modo per spostare il cursore in una posizione particolare in un campo di testo? – docchang

+0

Ho aggiornato il codice di esempio. Usa [mytextField selectedRange] per ottenere l'intervallo selezionato, che sarà solo un punto di inserimento se non c'è alcuna selezione, o sarà un intervallo di caratteri se c'è una selezione. –

10

Lei non potrà mai ottenere il shouldChangeCharactersInRange chiamato con una tastiera personalizzata .

Quello che si può ottenere è l'evento UIControlEventEditingChanged del UITextField. Quindi, invece di fare affidamento sul metodo shouldChangeCharactersInRange (che è noto per essere bacato in più), dovresti fare affidamento su questo evento, che verrà attivato ogni volta che l'utente cambia il contenuto del campo di testo.

[textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged]; 

Se si modifica da soli il campo di testo con la vostra tastiera personalizzata, basta chiamare questo metodo per informare tutti gli ascoltatori della manifestazione UIControlEventEditingChanged.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

Il tuo 'forControlEvents' dovrebbe corrispondere al tuo 'sendActionsForControlEvents' –

0

So che questa è una vecchia domanda ma ho incontrato lo stesso problema nel dover supportare i dispositivi precedenti 5.0. Se si sostituisce insertText: seguendo le istruzioni di Rob al http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html, si dovrebbe fare in modo che shouldChangeCharactersInRange venga attivato ogni volta.

Se è quindi necessario sostenere il tasto backspace come ho fatto è possibile utilizzare la risposta da @cormacrelf a How to simulate the delete key on UITextField?

L'unica snafu non sono stato in grado di risolvere è che quando si elimina un carattere da al centro della stringa il cursore salta indietro alla fine della stringa.

Problemi correlati